{"id":32158,"date":"2019-10-31T21:45:27","date_gmt":"2019-10-31T18:45:27","guid":{"rendered":"https:\/\/prohoster.info\/blog\/operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod\/"},"modified":"2019-10-31T21:45:27","modified_gmt":"2019-10-31T18:45:27","slug":"operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod","status":"publish","type":"post","link":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod","title":{"rendered":"Operating Systems: Three Easy Pieces. Part 4: Introduction to the Scheduler (translation)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1>Introduction to Operating Systems<\/h1>\n<p>\nHello, Habr! I would like to present to your attention a series of translation articles of some interesting literature in my opinion \u2014 OSTEP. This material dives deeply into the workings of Unix-like operating systems, specifically \u2014 working with processes, various schedulers, memory, and other similar components that make up a modern OS. You can view the original materials here <noindex><a rel=\"nofollow\" href=\"http:\/\/pages.cs.wisc.edu\/~remzi\/OSTEP\/\">here<\/a><\/noindex>. Please note that the translation is done non-professionally (rather freely), but I hope I preserved the overall meaning.<\/p>\n<p>Laboratory work on this subject can be found here:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/pages.cs.wisc.edu\/~remzi\/OSTEP\/Homework\/homework.html\">original<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/remzi-arpacidusseau\/ostep-code\">original<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/bykvaadm\/OS\/tree\/master\/ostep\">my personal adaptation<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nOther parts:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/446340\/\">Part 1: Intro<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/446866\/\">Part 2: Abstraction: process<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/447182\/\">Part 3: Introduction to Process API<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/en\/post\/449026\/\">Part 4: Introduction to the Scheduler<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nYou can also check out my channel on <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/bykvaadm\">Telegram<\/a><\/noindex> =)<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Introduction to the Scheduler<\/h2>\n<p>\n<u>The Essence of the Problem: How to Develop a Scheduler Policy<br \/>\nHow should the basic frameworks of scheduler policies be designed? What key assumptions must be made? What metrics are important? What basic techniques were used in early computing systems?<\/u><\/p>\n<h3>Workload Assumptions<\/h3>\n<p>\n Before discussing possible policies, let's first make a few simplifying digressions about the processes running in the system, collectively known as <b>workload<\/b>. Defining workload as a critical part of policy building and the more you know about the load, the better quality policy you can write.<\/p>\n<p>Let\u2019s make the following assumptions about the processes running in the system, sometimes referred to as <b>jobs<\/b> (tasks). Almost all of these assumptions are unrealistic, but necessary for the development of thought.<\/p>\n<ol>\n<li> Each task runs for the same amount of time,<\/li>\n<li> All tasks are submitted at the same time,<\/li>\n<li> The submitted task runs until completion,<\/li>\n<li> All tasks use only the CPU,<\/li>\n<li> The runtime of each task is known.<\/li>\n<\/ol>\n<h3>Scheduler Metrics<\/h3>\n<p>\n In addition to some assumptions about the load, we also need a tool to compare different scheduling policies: scheduler metrics. A metric is simply a measure of something. There are several metrics that can be used to compare schedulers.<\/p>\n<p>For example, we will use a metric called <b>turnaround time<\/b> Turnaround time for a task is defined as the difference between the completion time of the task and the time the task arrived in the system.<\/p>\n<p><u>Tturnaround=Tcompletion\u2212Tarrival<\/u><\/p>\n<p>Since we assumed that all tasks arrived at the same time, then Ta=0 and thus Tt=Tc. This value will naturally change when we alter the assumptions mentioned above.<\/p>\n<p>Another metric is <b>fairness. Performance and fairness are often opposing characteristics in scheduling. For example, a scheduler may optimize for performance at the cost of delaying other tasks, thereby reducing fairness.<\/b> FIRST IN FIRST OUT (FIFO)<\/p>\n<h3>The simplest algorithm we can implement is called FIFO or<\/h3>\n<p>\n The most basic algorithm we can implement is called FIFO or <b>first come (in), first served (out)<\/b>. This algorithm has several advantages: it is very simple to implement and fits all our assumptions, performing the task quite well.<\/p>\n<p>Let's consider a simple example. Suppose 3 tasks were set simultaneously. But let's assume task A arrived slightly earlier than the others, so it will be listed before the others, just as task B will be in relation to task C. Let's assume each of them will take 10 seconds to complete. What would be the average completion time of these tasks in this case?<\/p>\n<p><img decoding=\"async\" alt=\"Operating Systems: Three Easy Pieces. Part 4: Introduction to the Scheduler (translation)\" src=\"\/wp-content\/uploads\/2019\/04\/8c17c29e10ac8c2e15f5f9d865922e49.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nBy calculating the values \u2014 10+20+30 and dividing by 3, we get an average execution time of the program as 20 seconds.<br \/>\n Now let's try to change our assumptions. In particular, assumption 1, and thus we will no longer assume that each task takes the same amount of time. How will FIFO perform this time?<\/p>\n<p>As it turns out, different execution times for tasks have a very negative impact on the productivity of the FIFO algorithm. Suppose task A takes 100 seconds, while tasks B and C still take 10 seconds each.<\/p>\n<p><img decoding=\"async\" alt=\"Operating Systems: Three Easy Pieces. Part 4: Introduction to the Scheduler (translation)\" src=\"\/wp-content\/uploads\/2019\/04\/a375f3d1571f24df30f446b9bc7a9a9e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n As shown in the figure, the average time for the system will be (100+110+120)\/3=110. This effect is called <b>the convoy effect<\/b>, where some short-term consumers of a resource will line up behind a heavy user. It's like waiting in line at a grocery store when there\u2019s a customer in front of you with a full cart. The best solution to the problem is to try to switch lines or just relax and take deep breaths.<\/p>\n<h3>Shortest Job First<\/h3>\n<p>\n Is there a way to resolve such a situation with heavyweight processes? Of course. Another type of scheduling is called<b>Shortest Job First<\/b> (SJF). Its algorithm is also quite primitive \u2014 as the name suggests, the shortest tasks will be executed first, one after another.<\/p>\n<p><img decoding=\"async\" alt=\"Operating Systems: Three Easy Pieces. Part 4: Introduction to the Scheduler (translation)\" src=\"\/wp-content\/uploads\/2019\/04\/d0723e313adc9ce7367da611216bf3ee.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn this example, the result of running the same processes will improve the average turnaround time of the programs, and it will be <b>50 instead of 110<\/b>, which is almost 2 times better.<\/p>\n<p>Thus, under the given assumption that all tasks arrive at the same time, the SJF algorithm seems to be the most optimal one. However, our assumptions still do not appear realistic. This time, let's modify assumption 2 and assume that tasks can arrive at any time, rather than all at once. What problems could this lead to?<\/p>\n<p><img decoding=\"async\" alt=\"Operating Systems: Three Easy Pieces. Part 4: Introduction to the Scheduler (translation)\" src=\"\/wp-content\/uploads\/2019\/04\/2f0145551779f2733281d12bffad3a45.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLet's say task A (100s) arrives first and starts executing. At time t=10, tasks B and C arrive, each of which will take 10 seconds. Thus, the average execution time is (100+(110-10)+(120-10))\/3 = 103. What could the scheduler do to improve the situation?<\/p>\n<h3>Shortest Time-to-Completion First (STCF)<\/h3>\n<p>\n To improve the situation, let's drop assumption 3 that the program runs and works until completion. In addition, we will need hardware support and, as you might guess, we will use <b>a timer<\/b> to interrupt the running task and <b>context switching<\/b>. This way, the scheduler can take action at the moment tasks B and C arrive\u2014stop executing task A, process tasks B and C, and after they finish, continue executing process A. Such a scheduler is called <b>STCF<\/b>or <b>Preemptive Job First<\/b>.<\/p>\n<p><img decoding=\"async\" alt=\"Operating Systems: Three Easy Pieces. Part 4: Introduction to the Scheduler (translation)\" src=\"\/wp-content\/uploads\/2019\/04\/81644f82b7b1489f239ebbdc5d78000b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nThe result of this scheduler\u2019s operation will be: ((120-0)+(20-10)+(30-10))\/3=50. Thus, this scheduler becomes even more optimal for our tasks.<\/p>\n<h3>Response Time Metric<\/h3>\n<p>\n Thus, if we know the execution times of the tasks and that these tasks only use the CPU, STCF will be the best solution. And at one time, these algorithms worked quite well. However, now users spend most of their time at the terminal and expect productive interactive responses from it. Thus, a new metric was born\u2014 <b>response time<\/b> .<\/p>\n<p>Response time is calculated as follows:<\/p>\n<p><u>Tresponse=Tfirstrun\u2212Tarrival<\/u><\/p>\n<p>Thus, for the previous example, the response times will be: A=0, B=0, C=10 (abg=3.33).<\/p>\n<p>It turns out that the STCF algorithm is not very effective in situations where three tasks arrive simultaneously \u2014 it has to wait until the smaller tasks have fully completed. Thus, the algorithm is good for turnaround time metrics, but poor for interactivity metrics. Imagine sitting at a terminal trying to type characters in an editor and having to wait more than 10 seconds because another task is occupying the CPU. That's not very pleasant.<\/p>\n<p><img decoding=\"async\" alt=\"Operating Systems: Three Easy Pieces. Part 4: Introduction to the Scheduler (translation)\" src=\"\/wp-content\/uploads\/2019\/04\/f1412665826f845fdc685ec3c1a5bdad.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nThis brings us to another problem \u2014 how can we build a scheduler that is responsive to response time?<\/p>\n<h3>Round Robin<\/h3>\n<p>\n To solve this problem, an algorithm was developed <b>Round Robin<\/b> (RR). The main idea is quite simple: instead of running tasks to completion, we will run a task for a certain amount of time (called a time quantum) and then switch to another task in the queue. The algorithm continues to work until all tasks are completed. Additionally, the runtime should be a multiple of the time after which the timer interrupts the process. For example, if the timer interrupts the process every x = 10ms, then the execution window size must be a multiple of 10 and can be 10, 20, or x*10.<\/p>\n<p>Consider an example: Tasks A, B, and C arrive simultaneously in the system, and each wants to run for 5 seconds. The SJF algorithm would execute each task to completion before starting another. In contrast, the RR algorithm with a time slot of 1s would progress through the tasks as follows (see Fig. 4.3):<\/p>\n<p><img decoding=\"async\" alt=\"Operating Systems: Three Easy Pieces. Part 4: Introduction to the Scheduler (translation)\" src=\"\/wp-content\/uploads\/2019\/04\/a7790cb63c880b286db2a2e3782d59b2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n(SJF Again (Bad for Response Time)<\/p>\n<p><img decoding=\"async\" alt=\"Operating Systems: Three Easy Pieces. Part 4: Introduction to the Scheduler (translation)\" src=\"\/wp-content\/uploads\/2019\/04\/f7e82d68a6118828ea4561a4911744e2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n(Round Robin (Good For Response Time)<\/p>\n<p>The average response time for the RR algorithm is (0+1+2)\/3=1, whereas for SJF it is (0+5+10)\/3=5.<\/p>\n<p>It is logical to assume that the time slice is a very important parameter for RR; the shorter it is, the higher the response time. However, it should not be too small, as the context-switching time also plays a role in overall performance. Thus, the choice of execution time slice is set by the OS architect and depends on the tasks that are planned to be executed in it. Context switching is not the only overhead that consumes time \u2014 a running program also operates on various caches, and with each switch, it is necessary to save and restore this environment, which can also take a considerable amount of time.<\/p>\n<p>RR is an excellent scheduler if we're only talking about response time metrics. But how will the turnaround time metric behave with this algorithm? Let's consider the example above, where tasks A, B, and C each run for 5 seconds and arrive at the same time. Task A will finish at 13 seconds, B at 14 seconds, and C at 15 seconds, resulting in an average turnaround time of 14 seconds. Therefore, RR is the worst-performing algorithm for turnaround time metrics.<\/p>\n<p>In general terms, any RR-type algorithm is fair; it divides CPU time equally among all processes. Thus, these metrics constantly conflict with each other.<\/p>\n<p>Consequently, we have several opposing algorithms and still several assumptions remain \u2014 that the task time is known and that the task only uses the CPU.<\/p>\n<h3>Mixing with I\/O<\/h3>\n<p>\n First, let\u2019s remove assumption 4, which states that the process only uses the CPU; this is naturally not the case, as processes can also interact with other hardware.<\/p>\n<p>At the moment when a process requests an I\/O operation, it transitions to a blocked state, waiting for the completion of the I\/O. If the I\/O is sent to a hard disk, such an operation may take several milliseconds or longer, and during this time, the CPU will be idle. The scheduler can then assign the CPU to any other process. The next decision the scheduler must make is when the process will finish its I\/O. When this happens, an interrupt will occur, and the OS will transition the I\/O-requesting process to a ready state.<\/p>\n<p>Let's consider an example with several tasks. Each of them requires 50ms of CPU time. However, the first task will access I\/O every 10ms (which will also be executed in 10ms). Meanwhile, process B simply uses 50ms of CPU time without any I\/O.<\/p>\n<p><img decoding=\"async\" alt=\"Operating Systems: Three Easy Pieces. Part 4: Introduction to the Scheduler (translation)\" src=\"\/wp-content\/uploads\/2019\/04\/a32f5346eda86042c18d6424c19ad6b9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn this example, we will use the STCF scheduler. How will the scheduler behave if we run process A on it? It will proceed as follows: first, it will fully complete process A, and then process B.<\/p>\n<p><img decoding=\"async\" alt=\"Operating Systems: Three Easy Pieces. Part 4: Introduction to the Scheduler (translation)\" src=\"\/wp-content\/uploads\/2019\/04\/9fb709a822b9fc35871b8a342ac38c7e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nThe traditional approach to solving this problem is to interpret every 10ms subtask of process A as a separate task. Thus, when starting with the STJF algorithm, the choice between the 50ms task and the 10ms task is clear. Once subtask A completes, process B and the I\/O will be initiated. After I\/O is finished, the 10ms process A will be restarted instead of process B. This allows for overlapping, where the CPU is used by another process while the first one waits for I\/O. As a result, the system is better utilized \u2014 at the moment when interactive processes are waiting for I\/O, other processes can run on the CPU.<\/p>\n<h3>The oracle is gone.<\/h3>\n<p>\n Now let's try to eliminate the assumption that the execution time of a task is known. This is overall the worst and most unrealistic assumption on the list. In fact, in average operating systems, the OS usually knows very little about task execution times, so how can one build a scheduler without knowing how long a task will run? Perhaps we could use some principles of RR to address this issue?<\/p>\n<h3>Summary<\/h3>\n<p>\n We have looked at the basic ideas of task scheduling and examined two families of schedulers. The first runs the shortest task first, thereby improving turnaround time, while the second evenly splits time among all tasks, improving response time. Both algorithms perform poorly in situations where the algorithms from the other family excel. We also considered how parallel use of CPU and I\/O can enhance performance, but we still did not solve the problem of OS foresight. In the next session, we will explore a scheduler that looks into the near past and tries to predict the future, called the multi-level feedback queue.<br \/>\n<br \/>Source: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/449026\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0425\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439-\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u2014 OSTEP. \u0412 \u044d\u0442\u043e\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u0440\u0430\u0431\u043e\u0442\u0430 unix-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u2014 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438, \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430\u043c\u0438, \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u0438 \u043f\u0440\u043e\u0447\u0438\u0438\u043c\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u041e\u0421. \u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0432\u0441\u0435\u0445 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u043e\u0442 \u0442\u0443\u0442. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":23990,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32158","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0425\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439-\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u2014 OSTEP.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Operating Systems: Three Easy Pieces. Part 4: \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a (\u043f\u0435\u0440\u0435\u0432\u043e\u0434) | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0425\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439-\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u2014 OSTEP.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:45:27+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:45:27+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Operating Systems: Three Easy Pieces. Part 4: Introduction to the Scheduler (translation) | ProHoster","description":"Introduction to Operating Systems Hello, Habr! I would like to present to you a series of translated articles based on some literature that I find interesting \u2014 OSTEP.","canonical_url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"en_US","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Operating Systems: Three Easy Pieces. Part 4: \u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a (\u043f\u0435\u0440\u0435\u0432\u043e\u0434) | ProHoster","og:description":"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0425\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0438\u044e \u0441\u0442\u0430\u0442\u0435\u0439-\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u2014 OSTEP.","og:url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/operating-systems-three-easy-pieces-part-4-vvedenie-v-planirovshhik-perevod","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:45:27+00:00","article:modified_time":"2019-10-31T18:45:27+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32158","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 09:34:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:03:25","updated":"2026-01-21 09:34:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/32158","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/comments?post=32158"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/32158\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media\/23990"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media?parent=32158"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/categories?post=32158"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/tags?post=32158"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}