进程调度流程图(通用7篇)
1.进程调度流程图 篇一
简介:Linux® 的用户空间进程的创建和管理所涉及的原理与 UNIX® 有很多共同点,但也 有一些特定于 Linux 的独特之处,在本文中,了解 Linux 进程的生命周期,探索用户进程创建、内存管 理、调度和销毁的内核内幕。
Linux 是一种动态系统,能够适应不断变化的计算需求。Linux 计 算需求的表现是以进程 的通用抽象为中心的。进程可以是短期的(从命令行执行的一个命令),也可以 是长期的(一种网络服务)。因此,对进程及其调度进行一般管理就显得极为重要。
在用户空间,进程是由进程标识符(PID)表示的。从用户的角度来看,一个 PID 是一个数字值,可 惟一标识一个进程。一个 PID 在进程的整个生命期间不会更改,但 PID 可以在进程销毁后被重新使用, 所以对它们进行缓存并不见得总是理想的。
在用户空间,创建进程可以采用几种方式。可以执行一个程序(这会导致新进程的创建),也可以在 程序内,调用一个 fork 或 exec 系统调用。fork 调用会导致创建一个子进程,而 exec 调用则会用新 程序代替当前进程上下文。接下来,我将对这几种方法进行讨论以便您能很好地理解它们的工作原理。
在本文中,我将按照下面的顺序展开对进程的介绍,首先展示进程的内核表示以及它们是如何在内核 内被管理的,然后来看看进程创建和调度的各种方式(在一个或多个处理器上),最后介绍进程的销毁。
进程表示
在 Linux 内核内,进程是由相当大的一个称为 task_struct 的结构表示的。此结构包含所有表示此 进程所必需的数据,此外,还包含了大量的其他数据用来统计(accounting)和维护与其他进程的关系( 父和子)。对 task_struct 的完整介绍超出了本文的范围,清单 1 给出了 task_struct 的一小部分。 这些代码包含了本文所要探索的这些特定元素。task_struct 位于 ./linux/include/linux/sched.h。
清单 1. task_struct 的一小部分
struct task_struct { volatile long state; void *stack; unsigned int flags; int prio, static_prio; struct list_head tasks; struct mm_struct *mm, *active_mm; pid_t pid; pid_t tgid; struct task_struct *real_parent; char comm[TASK_COMM_LEN]; struct thread_struct thread; struct files_struct *files; ...};
在清单 1 中,可以看到几个预料之中的项,比如执行的状态、堆栈、一组标志、父进程、执行的线程 (可以有很多)以及开放文件。我稍后会对其进行详细说明,这里只简单加以介绍。state 变量是一些表 明任务状态的比特位。最常见的状态有:TASK_RUNNING 表示进程正在运行,或是排在运行队列中正要运 行;TASK_INTERRUPTIBLE 表示进程正在休眠、TASK_UNINTERRUPTIBLE 表示进程正在休眠但不能叫醒; TASK_STOPPED 表示进程停止等等。这些标志的完整列表可以在 ./linux/include/linux/sched.h 内找到 。
flags 定义了很多指示符,表明进程是否正在被创建(PF_STARTING)或退出(PF_EXITING),或是进 程当前是否在分配内存(PF_MEMALLOC)。可执行程序的名称(不包含路径)占用 comm(命令)字段。
每个进程都会被赋予优先级(称为 static_prio),但进程的实际优先级是基于加载以及其他几个因 素动态决定的。优先级值越低,实际的优先级越高。
tasks 字段提供了链接列表的能力。它包含一个 prev 指针(指向前一个任务)和一个 next 指针( 指向下一个任务)。
进程的地址空间由 mm 和 active_mm 字段表示。mm 代表的是进程的内存描述符,而 active_mm 则是 前一个进程的内存描述符(为改进上下文切换时间的一种优化)。
thread_struct 则用来标识进程的存储状态。此元素依赖于 Linux 在其上运行的特定架构,在 ./linux/include/asm-i386/processor.h 内有这样的一个例子。在此结构内,可以找到该进程自执行上 下文切换后的存储(硬件注册表、程序计数器等)。
进程管理
现在,让我们来看看如何在 Linux 内管理进程。在很多情况下,进程都是动态创建并由一个动态分配 的 task_struct 表示。一个例外是 init 进程本身,它总是存在并由一个静态分配的 task_struct 表示 。在 ./linux/arch/i386/kernel/init_task.c 内可以找到这样的一个例子。
Linux 内所有进程的分配有两种方式。第一种方式是通过一个哈希表,由 PID 值进行哈希计算得到; 第二种方式是通过双链循环表。循环表非常适合于对任务列表进行迭代。由于列表是循环的,没有头或尾 ;但是由于 init_task 总是存在,所以可以将其用作继续向前迭代的一个锚点。让我们来看一个遍历当 前任务集的例子。
任务列表无法从用户空间访问,但该问题很容易解决,方法是以模块形式向内核内插入代码。清单 2 中所示的是一个很简单的程序,它会迭代任务列表并会提供有关每个任务的少量信息(name、pid 和 parent 名)。注意,在这里,此模块使用 printk 来发出结果。要查看具体的结果,可以通过 cat 实用 工具(或实时的 tail -f /var/log/messages)查看 /var/log/messages 文件。next_task 函数是 sched.h 内的一个宏,它简化了任务列表的迭代(返回下一个任务的 task_struct 引用)。
清单 2. 发出任务信息的简单内核模块(procsview.c)
#include #include #include int init_module( void ){ /* Set up the anchor point */ struct task_struct *task = &init_task; /* Walk through the task list, until we hit the init_task again */ do { printk( KERN_INFO “*** %s [%d] parent %sn”, task->comm, task->pid, task->parent->comm ); } while ( (task = next_task(task)) != &init_task ); return 0;}void cleanup_module( void ){ return;}
可以用清单 3 所示的 Makefile 编译此模块。在编译时,可以用 insmod procsview.ko 插入模块对 象,也可以用 rmmod procsview 删除它。
清单 3. 用来构建内核模块的 Makefile
obj-m += procsview.oKDIR := /lib/modules/$(shell uname -r)/buildPWD := $(shell pwd)default: $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
插入后,/var/log/messages 可显示输出,如下所示,
从中可以看到,这里有一个空闲任务(称为 swapper)和 init 任务(pid 1)。
Nov 12 22:19:51 mtj-desktop kernel: [8503.873310] *** swapper [0] parent swapperNov 12 22:19:51 mtj-desktop kernel: [8503.904182] *** init [1] parent swapperNov 12 22:19:51 mtj-desktop kernel: [8503.904215] *** kthreadd [2] parent swapperNov 12 22:19:51 mtj-desktop kernel: [8503.904233] *** migration/0 [3] parent kthreadd...
注意,还可以标识当前正在运行的任务。Linux 维护一个称为 current 的符号,代表的是当前运行的 进程(类型是 task_struct)。如果在 init_module 的尾部插入如下这行代码:
printk( KERN_INFO, “Current task is %s [%d], current->comm, current->pid );
会看到:
Nov 12 22:48:45 mtj-desktop kernel: [10233.323662] Current task is insmod [6538]
注意到,当前的任务是 insmod,这是因为 init_module 函数是在 insmod 命令执行的上下文运行的 。current 符号实际指的是一个函数(get_current)并可在一个与 arch 有关的头部中找到(比如 ./linux/include/asm-i386/current.h 内找到)。
进程创建
让我们不妨亲自看看如何从用户空间创建一个进程。用户空间任务和内核任务的底层机制是一致的, 因为二者最终都会依赖于一个名为 do_fork 的函数来创建新进程。在创建内核线程时,内核会调用一个 名为 kernel_thread 的函数(参见 ./linux/arch/i386/kernel/process.c),此函数执行某些初始化后 会调用 do_fork。
创建用户空间进程的情况与此类似。在用户空间,一个程序会调用 fork,这会导致对名为 sys_fork 的内核函数的系统调用(参见 ./linux/arch/i386/kernel/process.c)。函数关系如图 1 所示。
图 1. 负责创建进程的函数的层次结构
从图 1 中,可以看到 do_fork 是进程创建的基础。可以在 ./linux/kernel/fork.c 内找到 do_fork 函数(以及合作函数 copy_process)。
do_fork 函数首先调用 alloc_pidmap,该调用会分配一个新的 PID。接下来,do_fork 检查调试器是 否在跟踪父进程。如果是,在 clone_flags 内设置 CLONE_PTRACE 标志以做好执行 fork 操作的准备。 之后 do_fork 函数还会调用 copy_process,向其传递这些标志、堆栈、注册表、父进程以及最新分配的 PID。
新的进程在 copy_process 函数内作为父进程的一个副本创建。此函数能执行除启动进程之外的所有 操作,启动进程在之后进行处理。copy_process 内的第一步是验证 CLONE 标志以确保这些标志是一致的 。如果不一致,就会返回 EINVAL 错误。接下来,询问 Linux Security Module (LSM) 看当前任务是否 可以创建一个新任务。要了解有关 LSM 在 Security-Enhanced Linux (SELinux) 上下文中的更多信息, 请参见 参考资料 小节。
接下来,调用 dup_task_struct 函数(在 ./linux/kernel/fork.c 内),这会分配一个新 task_struct 并将当前进程的描述符复制到其内。在新的线程堆栈设置好后,一些状态信息也会被初始化 ,并且会将控制返回给 copy_process。控制回到 copy_process 后,除了其他几个限制和安全检查之外 ,还会执行一些常规管理,包括在新 task_struct 上的各种初始化。之后,会调用一系列复制函数来复 制此进程的各个方面,比如复制开放文件描述符(copy_files)、复制符号信息(copy_sighand 和 copy_signal)、复制进程内存(copy_mm)以及最终复制线程(copy_thread)。
之后,这个新任务会被指定给一个处理程序,同时对允许执行进程的处理程序进行额外的检查 (cpus_allowed)。新进程的优先级从父进程的优先级继承后,执行一小部分额外的常规管理,而且控制 也会被返回给 do_fork。在此时,新进程存在但尚未运行。do_fork 函数通过调用 wake_up_new_task 来 修复此问题。此函数(可在 ./linux/kernel/sched.c 内找到)初始化某些调度程序的常规管理信息,将 新进程放置在运行队列之内,然后将其唤醒以便执行。最后,一旦返回至 do_fork,此 PID 值即被返回 给调用程序,进程完成。
进程调度
存在于 Linux 的进程也可通过 Linux 调度程序被调度。虽然调度程序超出了本文的讨论范围,但 Linux 调度程序维护了针对每个优先级别的一组列表,其中保存了 task_struct 引用。任务通过 schedule 函数(在 ./linux/kernel/sched.c 内)调用,它根据加载及进程执行历史决定最佳进程。在 本文的 参考资料 小节可以了解有关 Linux 版本 2.6 调度程序的更多信息。
进程销毁
进程销毁可以通过几个事件驱动 — 通过正常的进程结束、通过信号或是通过对 exit 函数的调用。 不管进程如何退出,进程的结束都要借助对内核函数 do_exit(在 ./linux/kernel/exit.c 内)的调用 。此过程如图 2 所示。
图 2. 实现进程销毁的函数的层次结构
do_exit 的目的是将所有对当前进程的引用从操作系统删除(针对所有没有共享的资源)。销毁的过 程先要通过设置 PF_EXITING 标志来表明进程正在退出。内核的其他方面会利用它来避免在进程被删除时 还试图处理此进程。将进程从它在其生命期间获得的各种资源分离开来是通过一系列调用实现的,比如 exit_mm(删除内存页)和 exit_keys(释放线程会话和进程安全键)。do_exit 函数执行释放进程所需 的各种统计,这之后,通过调用 exit_notify 执行一系列通知(比如,告知父进程其子进程正在退出) 。最后,进程状态被更改为 PF_DEAD,并且还会调用 schedule 函数来选择一个将要执行的新进程。请注 意,如果对父进程的通知是必需的(或进程正在被跟踪),那么任务将不会彻底消失。如果无需任何通知 ,就可以调用 release_task 来实际收回由进程使用的那部分内存。
结束语
Linux 还在不断演进,其中一个有待进一步创新和优化的领域就是进程管理。在坚持 UNIX 原理的同 时,Linux 也在不断突破。新的处理器架构、对称多处理(SMP)以及虚拟化都将促使在内核领域内取得 新进展。其中的一个例子就是 Linux 版本 2.6 中引入的新的 O(1) 调度程序,它为具有大量任务的系统 提供了可伸缩性。另外一个例子就是使用 Native POSIX Thread Library (NPTL) 更新了的线程模型,与 之前的 LinuxThreads 模型相比,它带来了更为有效的线程处理。有关这些创新及其前景的更多信息,请 参见 参考资料。
2.进程调度流程图 篇二
随着现代应用对计算机系统性能要求的不断提高, 单核的发展已经处于瓶颈阶段, 多核处理器成为发展的主流, 基于多核处理器的操作系统也应用而生。起初为单处理器设计的Linux操作系统, 随着并行技术的发展, 功能上扩展了对SMP系统的支持, 获得了比几台独立的机器组合起来更好的性能。本文以Linux2.6版为基础, 详细分析了Linux内核所支持的SMP体系结构模型、SMP中进程调度的机制及其存在的问题, 提出了一种改进的方法。
SMP架构
在一个计算机系统中有多个CPU, 各个CPU同步执行操作系统的一份拷贝, 并且它们公用系统总线、内存、I/O设备等资源, 这种系统就是对称多处理机SMP (Symmetrical Multi-Processing) (1) 。可见在SMP系统中, 多个处理器公用总线、内存以及I/O等资源, 并且由它们共同执行整个系统中的所有任务, 以提升系统整体的运算处理能力。因此, SMP系统也称作一致性内存访问UMA (Uniform Memory Access) 系统。
在SMP中不存在谁是主CPU, 谁是从CPU, 为了降低各CPU对内存访问的冲突和提高指令和数据的读写速度, SMP硬件做了相应的改进, 使得每个CPU都有自己的高速缓存。若内存在同一时间受到多个CPU的访问, 每个CPU把自己的高速缓存存满后, 就可在相当长的时间内无需访问系统内存。除此之外, SMP系统中的CPU必须内置高级的可编程中断控制器 (Advanced Programmable Interrupt Controllers, APIC) 单元, CPU彼此通过中断完成它们之间的通信。
SMP是同构多核技术, SMP中所有的CPU只跑一个操作系统副本, 由操作系统给各个应用程序分配CPU核, 各个CPU核之间需要在操作系统层实现协作。在Linux系统中, 提供了支持SMP的编译选项, 通过在编译前配置内核时打开CONFIG_SMP选项, 就可以让内核把源码中关于SMP的代码一起编译, 其中关于SMP的代码放在#ifdef CONFIG_SMP和#endif之间。Linux会在系统启动时得到处理器的拓扑结构。
SMP的调度
在Linux系统中采用SMP架构, 系统进行调度时既要保证进程调度的顺畅进行, 又要保证系统资源的合理使用。尤其对CPU而言, 不仅要让CPU资源得到尽可能的利用, 还要保证每个CPU资源得到均衡的使用, 避免让有的CPU超负荷执行任务, 而有的CPU处于空闲状态。
在linux中进程被调度发生切换的情况时常出现, 进程的切换分一般分两步完成:一是通过时钟中断触发更新检查机制, 看是否需要发生进程切换;二是利用schedule () 来完成最后的切换工作。
1 scheduler_tick () 函数
当一个时钟到来时, 系统的APIC会申请一次时钟中断, 系统中负责处理时钟中断的函数timer_interrupt () 就被调用, 该函数在执行的过程中又会调用do_timer_interrupt_hook () 函数, do_timer_interrupt_hook () 函数执行时会调用do_timer () 、update_process_times () 和scheduler_tick () 函数, 其中scheduler_tick () 函数 (2) 负责更新时间片的剩余节拍数, 管理内核中与整个系统调度相关的统计信息, 并负责激活当前进程调度类的周期性调度方法, 尤其是如果经过判断系统需要做周期性的负载均衡, 则会触发软中断SCHED_SQFTIRQ, 来进行系统的负载均衡操作。
2 schedule () 函数
该函数是Linux系统进程调度中最重要的一个函数, 它的主要作用就是从运行队列链表中选择一个优先级最高的进程来代替当前进程运行。
一般schedule () 函数的调用可以是主动调用也可是被动调用。如果当前进程因缺乏资源而被阻塞, 就主动调用schedule () 函数;如果是当前进程用完了它的时间片, 或者被唤醒的进程的优先权比当前进程的优先权高, 再或者是系统调用sched_setscheduler () 函数时, 就会被动调用schedule () 。Schedule () 函数的工作流程大概包括:清理当前运行的进程、选择下一个要运行的进程、设置新进程的运行环境和完成进程的上下文切换。
3 SMP负载平衡操作
在SMP系统中, 每个CPU上的任务量不是固定不变的, 而是随着时间的变换, 每个处理器上的负载也在变化, 可能有些处理器超载运行而有些处理器却是闲置的, 因此, 在Linux系统中会把重载处理器上的任务挪到相对较空闲的轻载处理器上, 即进行负载平衡。
3.1负载平衡的时机
在Linux kernel中有两条路径可查看系统当前负载情况, 用以决定是否需要进程负载平衡操作。
左边的一路表示:当schedule () 函数在调用的过程中, 发现CPU的运行队列为空时, 会调用idle_balance () 函数, 进而调用load_balance () 函数来进行负载平衡。右边一路表示:在每次时钟中断调用scheduler_tick () 函数时, 经过判断, 系统如果需要做负载平衡时, 触发软中断SCHED_SQFTIRQ, 调用中断处理函数run_rebalance_domanis () , 再调用reblance_domains () 函数, 遍历整个调度域, 确定平衡操作的频率, 最后调用load_balance () 进行负载平衡。
3.2负载平衡的处理过程
Linux中负载平衡主要是由函数load_balance () 、move_tadks () 和pull_task () 实现的。
具体来讲, 负载平衡开始调用load_balance () 函数, 找到调度域中最忙的一组中的最忙的CPU运行队列, 再调用move_task () ;move_task () 函数负责将一些进程从最忙的CPU运行队列转移到本地CPU运行队列中, 在调用balance_tasks () 函数;balance_tasks () 函数遍历最忙的CPU的运行队列, 根据转移的任务量和转移的约束条件, 确定要转移的任务, 在调用pull_task () ;pull_task () 函数负责将一个进程从最忙的运行队列中删除, 并插入到本地CPU运行队列中。
经过以上操作, 系统中负载较重的CPU上的任务会被转移到负载较轻或空闲的CPU上, 完成负载均衡, 从而提高系统整体的性能。
SMP调度算法的改进
从Linux系统应用的实际反馈来看, Linux调度在SMP方面表现出的性能还是很优异的, 但也存在一些问题, 例如, Linux系统的调度模型对SMP而言, 针对性不太强;在SMP架构中, 多个设备共享总线, 造成SMP扩展方面的缺陷;系统中的每个CPU都要使用内存, 内存就会因为竞争而成为瓶颈;系统定时的负载平衡操作, 造成了Cache一定程度上的失效等问题。在上述问题中, 本文研究的主要是Cache失效问题。
1 Cache失效
根据SMP结构模型可知, 每个CPU内带有高速缓存Cache, 其作用是为缓解CPU和内存在存取速度上的差异, 其容量往往只有主存的几百分之一, 但存取速度高于内存, 甚至接近CPU的存取速度。当CPU在内存中存取指令或数据的时候, 根据局部性原理, 正在被访问的主存单元领近的一些单元将被访问的可能性很大, 所以, 当CPU存取主存某一单元时, 系统的硬件会自动将包括该单元在内的一组单元的内容调入Cache, CPU即将访问的存储单元的内容很可能在Cache中, Cache的命中率越高, Cache的效率越高。
在Linux中对SMP调度时, 由于CPU负载的不均衡, 要对其进行负载均衡操作, 即将重载CPU上的部分任务转移到轻载或空闲的CPU上, 那么预取到重载CPU所属的Cache中的指令和数据就会失效, 造成Cache的效率下降, 进而影响了CPU的效率和整个计算机系统的性能。
在Linux中, 为解决Cache的失效问题, 系统也采取了一些措施, 本文以尽量减少Cache失效为目标, 提出一个优化方案。
2优化方法
为提高系统的资源利用率和整体性能, 充分利用Cache, 对SMP在调度时, 优化的方法如下。
2.1转移目标的选择
利用Linux支持的用户锁定机制futex, 将共享资源多的进程关联起来, 以便利用该锁, 让共享资源多的进程被分配到一起执行。利用转移函数确定任务转移的目标端, 将共享同一把锁的进程中的第一个被调度的进程所运行的处理器记录下来, 进而将共享同一把锁的进程分配到同一个处理器上运行。
2.2修改task_struct结构
在task_struct结构中添加一个整型的字段cpuid, 用以表示对一个进程而言, 最适合运行的cpu。在创建进程时, 将其值设定为-1。
2.3系统利用用户锁定futex将共享资源多的进程关联起来, 在该锁唤醒某一进程时, 把CPU的编号一起发给被阻塞的进程。
通过以上改进, 可使共享资源多的进程尽量能被分配到同一处理器上运行, 从而在一定程度上提高了cache的利用率。
结束语
本文详细分析了Linux系统中SMP架构模型和SMP调度算法, 并且对SMP的调度算法进行了详细的阐述, 尤其是SMP的负载平衡操作及负载平衡操作所带来的cache失效问题并给出了改进的方法。
注释
11 李锋涛, 郑晓曦.基于SMP结构的linux内核进程调度的研究[J].数字技术与应用, 2011, (11) :89-90
3.进程调度流程图 篇三
关键词:分布式系统;多任务调度;进程;线程;负载均衡
中图分类号:TP316.4文献标识码:A文章编号:1007-9599 (2011) 06-0000-02
Multi-task Assignment and Process/Thread Adjustment in Distribution System
Yao Dong
(Beijing University of Posts and Telecommunications,BeiJing100083,China)
Abstract:Distributed multi-task operating system distribution and task scheduling,load balancing is difficult to achieve,which processes and threads to achieve the task execution and distribution of one of the most important concepts.How to implement a distributed system processes and threads created,and the interaction between the information is a vital part of distributed system design.On the traditional operating system processes and threads and to compare the realization of the mechanism,further discussed in the distributed operating system,how to multi-task allocation,how the different distribution among the host of the process as well as load balancing.
Keywords:Distributed system;Multi-task scheduling;Process;
Thread;Load balancing
一、引言
分布式系统是计算机发展的一个大趋势,目前云计算、云存储的概念已经逐渐落地,实际上云计算就是分布式系统的一种实现。在分布式系统中,进程(在很多操作系统中也称为任务)是十分重要的概念,是实现任务调度与执行的关键,而线程是轻量级的进程,在响应速度与执行效率上相比进程有很大的改进。在分布式系统中如何实现多任务执行,如何在分布的主机以及CPU上进行创建和分配,涉及到调度策略。另外,如何实现分布式系统中进程间以及线程间的通信,也是需要重点考虑的问题。并且关乎分布式系统执行的效率和效果。
我在对分布式操作系统的研究和学习中发现,许多传统单机操作系统的概念实际上是可以沿用的,但是由于分布式系统自身的特性决定了,这些概念的复用是需要根据分布式系统进行调整和完善的。希望通过本文对传统进程与线程的简单分析和比较,从而探讨如何在分布式环境中进行进程与线程的创建与调度,如何在分布式环境中对多任务进行负载均衡。
二、进程与线程
现代操作系统最基本的构件就是进程。进程是进行系统资源分配、调度和管理的最小独立运行单位,操作系统的各种活动都与进程有关。每个进程是由私有的虚拟地址空间、代码、数据和其它系统资源组成。进程在运行时创建的资源随着进程的终止而死亡。
传统的UNIX进程概念在开发分布式系统应用时已力不从心,这些问题的最好解决之道就是线程,线程推广了进程的概念使一个进程可以包含多个活动。如今,由于线程概念的普及,在UNIX系统中已经普遍实现了线程机制,开发并发应用的程序员现在也可以广泛接触到线程的函数库了。
在传统的Unix模型中,当一个进程需要由另一个实体来执行某件事情时,它就fork一个子进程,让子进程去进行处理。尽管这种模式已经成功使用了很多年,但是仍然暴露出以下问题:
fork开销很大。内存映像需要从父进程拷贝到子进程,所有描述字要在子进程中复制一份,等等。当前的系统实现使用一种称为写时拷贝(copy-on-write)的技术,可以避免父进程数据一开始就向子进程拷贝,直到子进程确实需要自己的拷贝为止。尽管有这种优化技术,但fork的开销仍然很大。
Fork子进程后,需要用进程间通信(IPC)在父子进程间传递信息。Fork之前由父进程准备好的数据很容易传递,因为子进程是从父进程的数据空间及所有描述字的一个拷贝开始的,但是从子进程返回信息给父进程却颇费周折。
线程有助于解决这两个问题。线程有时称为轻权进程,因为线程比进程“权轻”。也就是说,创建线程可能比创建进程快10-100倍:
在一个已存在的进程中创建一个线程比创建一个新进程开销更小。创建新的进程需要进行内存的拷贝操作,这就额外的增加了系统负担,而线程则不需要这个拷贝过程。不过由于现在的操作系统的实现是仅仅当内存需要改变的时候才拷贝改动的部分,所以这里的影响相对还是比较小的。
线程通常用在需要比较好的同步操作的场合。例如,某个问题可以分解为多个几乎对等同步处理的任务的话,则是用线程是很好的选择。进程则适合应用在不需要严格的同步的场合。
线程之间共享数据很方便,因为不同的线程本来就是共享同样的存储空间。而不同进程之间共享数据则需要使用一些IPC机制,例如管道、共享内存、套接字等等。
三、分布式操作系统中进程与线程的创建与调度
事实上,当前使用的操作系统都是把任务分割为进程和线程,分时运行在一个处理器中。这种类似的任务处理方式也可以在很多高性能的应用程序中可以看到,例如数据库引擎、科学计算程序、工作站的工程工具和多媒体程序等。
为了增加处理能力,多数操作系统、应用程序都设计为可以在双处理器和多处理器环境中运行,这样可以利用对称多处理器(SMP)结构将进程和线程放到处理器池中进行运算。通过在一个单芯片中执行两个逻辑CPU,超级线程技术在当前的操作系统和高性能应用中进行进程和线程级的并行处理。多CPU之间进行进程分配的思路与分布式操作系统中进程与线程的创建和调度类似。
在分布式操作系统中,一个新进程的创建分为三个步骤:
1.选择一个目标主机。
2.创建一个执行环境。
3.在执行环境中创建线程。
这三个步骤,除选择目标主机以外,其他两项都与传统的操作系统实现机制相同。需要注意的是,不论分布式操作系统的控制权是如何实现的,作为服务器的主机,必须存放各主机中进程的信息,或者在每个主机上有备份。各目标主机间的通信,以进程级的通信为基础,不同进程间的线程通信,也是通过其主线程进行的。
四、分布式操作系统中进程、线程与多任务分配
一个进程中的所有线程都在该进程的虚拟地址空间中,使用该进程的全局变量和系统资源。操作系统给每个线程分配不同的CPU时间片,在某一个时刻,CPU只执行一个时间片内的线程,多个时间片中的相应线程在CPU内轮流执行,由于每个时间片时间很短,所以仿佛各个线程在计算机中是并行处理的。操作系统是根据线程的优先级来安排CPU的时间,优先级高的线程优先运行,优先级低的线程则继续等待。
在分布式操作系统中,多个应用程序同时运行可以采用两种方式进行:
1.协作式多任务方式。协作这个用语意味着多个应用程序之间必须相互协调,依次实现对操作系统的控制。它们并不是真正的多任务执行,因为其中还有多任务共享系统资源的问题。为了让操作系统把控制权从一个程序转换到另一个程序,当前活动的程序就必须周期地检查一个消息队列。
2.带优先权的多任务方式,称为抢先式多任务。在这种方式下,操作系统可以在需要时中断当前的任务,再按照任务队列中各个任务的优先级别来进行任务的调度。
抢先式多任务执行实际上就是抢先式多线程执行,每个线程有一个优先级值。优先级最低的保留给系统使用。其余的分成四类:空闲、正常、高、和实时。注意这些范围是有重叠的。这样做可使调度更灵活,例如,允许某些后台任务比某些前台任务更重要,尽管在通常情况下,前台任务的优先级应该更高。使用实时优先级时要非常当心。如果你把一个任务的优先级设得太高,也可能无法实现多任务执行功能。这是因为一个任务的优先级太高了,它就完全不允许系统中有其他任务运行。
VMM(虚拟机管理程序)负责在分时抢先的环境里调度各个进程和线程,具体包括以下服务:生成线程、管理线程、撤消线程和线程调度。VMM中有两个调度程序:主调度程序和时间片调度程序。主调度程序负责确定最高优先级的线程。只有最高优先级的线程才会运行,其他优先级较低的都被封锁;时间片调度程序负责为所有具有最高优先级的可运行任务分配时间片。
系统运行过程中,线程的优先级可由系统或设备驱动程序改变。例如,一旦中断产生,则处理这个中断的线程优先级临时提高,以便它立即得到时间来处理该中断。完成后,优先级可以再降低。
五、结束语
在分布式操作系统中,实现多任务分配与传统操作系统的实现机制类似,不同的是,需要在不同主机的进程间进行分配,同时还涉及到多线程的情况。但是,基本的思路是以进程为基础,进程的负荷平衡就能够保证线程负荷均衡。具体进程内部的任务分担可以由进程自己实现,机制可以参考传统操作系统的实现。
参考文献:
[1]W.Richard Stevens.Stephen A.Rago.UNIX环境高级编程[M].北京:人民邮电出版社,2006:242-504
[2]W.Richard Stevens.UNIX网络编程:第2卷,进程间通信[M].北京:人民邮电出版社,2010:141-241
[3]W.Richard Stevens.UNIX网络编程.卷1,套接字联网API[M].北京:人民邮电出版社,2010:423-611
[4]何炎祥.分布式操作系统[M].北京:高等教育出版社,2005:343-436
[5]何炎祥,熊前兴.操作系统原理[M].北京:华中科技大学出版社,2001:125-244
[6]佚名.Windows系统进程全解剖[EB/OL].[2009-12-29].http://www.qqread.com/meetwindows/j486113.html
4.调度作业流程 篇四
1调度日作业流程
1.1早班(08:00-16:00点)调度作业流程
a.08:15总调交接班,交接班会由生产调度指挥中心副主任(或)主持,上、下班总调参加,会议由上一班值班总调汇报上一班次的主要生产情况、设备检维修情况、原料和产品的库存情况等;生产调度指挥中心副主任安排当日计划、装置运行中出现的问题和需要协调解决的问题、下一班工作重点及建议等,接班人员要尽快熟悉情况,做好记录。
b.08:00~09:00详细了解生产状况,落实当日生产调度指挥中心生产计划任务,分解工作重点,并将重点记录到《交接班记录》上;与各生产公司(装置)调度(值班长)沟通,进一步分析了解生产情况,对各公司(装置)需协调度的问题提出解决办法,并做好记录。
c.12:00~13:00白班总调度第二次了解各生产公司(装置)生产运行情况,重点掌握公司级生产控制指标,及时做好各装置的运行记录;监测日计划、班计划完成进度。
d.15:00~16:00汇总当日装置生产、设备检维修、安全重点及事故隐患处理等情况,对重要的、影响运行的情况向部门领导汇报;总调对班中生产出现的问题要跟踪分析、落实,对整体情况进行小结,完成当班的生产交接班日记,向下一班汇报本班生产运行情况和协调解决的问题及未尽事宜,做好交班。
1.2 中班(16:00-0:00点)调度作业流程
a.16:30根据早交班会和中交接班会提出和确定的重点,通过对当日关键环节的跟踪,填写调度“当日要情”,报生产调度指挥中心副主任审核后存档。
b.17:00落实“当日要情”的各项记录,准备次日协调解决计划,值班总调根据当日运行情况,在与部门、各生产公司(装置)充分沟通的情况下,下达次日生产协调计划。
c.18:00总调度第一次全面了解当班装置生产情况。
d.19:30搜集各单位完成情况数据信息。
e.20:00落实碰头会的各项内容,总调对领导交办的重点事项记录到《交接班记录》上。
f.21:00调度当前生产运行情况,对生产中出现的问题进一步了解,跟踪落实情况,并对整体运行情况进行小结。
g.22:00中班总调第二次全面了解当班装置生产情况,如果有领导批示、指示,分别上到信息网的相关栏目内;遇有事故或者故障情况,按照固定格式上到信息网相应栏目内。
h.23:30汇总当日装置生产情况,设备检、维修情况,其它安全重点情况,各主要生产装置存在的事故隐患和处理情况,记录当班发生的重要事件,针对事件所采取的措施、处理落实情况。
i.00:00完成当班的生产交接班日记,由值班总调度召开交接班会,当班总调向下一班汇报本班生产运行情况和协调解决的问题及未尽事宜,和下一班组做好交接。
1.3 夜班(0:00-08:00点)调度作业流程
a.00:30了解上一班次的主要生产情况,重点是调度协调解决问题和未尽事宜,对协调情况和各 环节运行情况、主要指标进度完成情况等,并对出现的问题及时进行协调解决。
b.02:00全面了解当班生产情况
c.03:30调度当前生产运行情况对生产中出现的问题进一步了解,跟踪落实情况,并对整体运行情况进行小结。
d.05:00在全面掌握生产情况的基础上,对夜班完成及白班计划情况进行协调、分析,将上述情况汇总后形成书面材料,记录到交接班记录本。
e.06:00第二次全面了解当班装置生产情况
f.07:30向生产调度指挥中心领导汇报夜班运行情况,重点汇报夜班运行情况及影响装置运行的重点问题,提出合理化建议。
g.08:15交班会,值班总调向下一班交接。
2调度月度工作流程
2.11-3日编制上月调度报表:搜集整理各专业部门、各生产公司(装置)上月完成数据,报公司领导审核存案。
2.24-6日准备生产月报,总结当月,部署下月计划:通报当月装置指标实际完成情况,强调当月工作重点,部署下月生产计划。
2.37-13日:日常工作:主要是日常调度协调工作。
2.414日调度室半月调度会议:总结上半个月各部门、各生产公司(装置)各项生产工作,确定下半月各部门、各生产公司(装置)重点工作,分解落实各项工作,定措施、责任人、定完成时间。确定本
月生产计划安排。协调解决各部门、各生产公司(装置)提出的问题。
2.515-17日总结分析上旬情况:总结分析上半月各项指标完成情况,及时查找运行中存在的问题,并将情况反映在调度日报的“当日要情”中。
2.618-22日:日常工作:主要是日常调度协调工作。
2.723日调度月计划平衡会部门会议:研究分析存在的问题,制订解决措施,加以落实。
2.824-25日组织专人到基层进行调研:针对日常反映上的问题进行专题研究,并与相关各部门、各生产公司(装置)以召开现场会的形式进行落实,调研过程中对存在的问题进行深入细致探讨,调研后形成专题报告上报公司领导。
2.926-
28、30或31日全面总结
1、全面总结当月以来全公司生产等各环节运转情况、各项指标完成情况、各单位之间协调配合情况、取得的成绩和存在的问题等,并形成书面材料。
2、制定计划:通过调查研讨,编制出下个月的生产计划,及重点工作,其中下个月计划是根据公司调度例会提出的要求、计划及各单位所上报的建议计划经汇总形成。
3、准备月底的生产准备调度会,确定的会议时间,并做好一切会务准备。
4、向主管领导汇报下月建议计划及计划制订的依据,并根据领导指示对计划进行调整。召开月调度计划平衡会,分析总结本月以来
生产等各方面的情况,查找问题,议定措施,并确定下个月作业计划及重点工作,通报下月生产计划。
5、根据调度会上各单位汇报的情况,对重要信息进行汇总、归纳,整理公司领导讲话,形成会议纪要,修订作业计划,报送主管领导审核后下发至各单位执行。
6、总结分析当月各项指标完成情况,及时查找运行中存在的问题,明确今后工作方向。
3调度作业流程
调度业务安排主要根据集团公司下发的生产计划,在确保装置安、稳、长、满、优高质量完成生产目标的情况下,根据宏观经济及内外部运行环境的实际变化,对月度、季度等局部时间段计划进行适当调整。
1、一季度:力争实现首季生产开门红,为完成全年任务打基础。根据一季度生产特点,在一季度工作时,调度室要坚持抓住提前量,加强协调力度,抓住生产运营关键环节,解决影响制约下一步发展的关键问题,坚持完成年进度计划,确保生产均衡,平稳运行,为下季度的工作打好基础。
2、二季度:狠抓节本降耗工作,确保实现“时间过半,任务过半”;二季度调度的主要工作就是根据全年生产计划做好装置优化操作,协调各生产生产公司(装置),从节水、节汽方面入手,全方位做好装置间的染动能耗的平衡、协调工作,开展各种节能改造和节本降耗竞赛等活动,全力确保上半年实现 “双过半”。
3、三季度:抓好装置的平稳运行,消除安全隐患,给全年任务完成提供保障。通过抓好雨季汛期日常的平稳运行,确保装置高效、均衡、稳定运行,给全年任务完成提供保障。一般来说,从三季度完成情况即可看出全年各项工作的趋势,完成的好,就能超进度或按时完成计划。因此,抓好三季度工作,能减轻年底的工作压力,还有利于四季度装置过冬的问题,保证装置生产稳定运行。
5.生产调度工作流程2 篇五
1. 作为一名生产调度首先要抓车间生产纪律,调度好车间安全生产任务、协调好两个车间的人员安排。
2. 掌握车间的设备情况采取相应的维修措施,使两个车间能保持正常、安全生产、环保生产。
3. 严格控制生产工艺指标,严查跑、冒、漏、滴、超温、超压、超负荷等现象,要做到查出一起处理一起,绝不推诿。
4. 安排好各车间的一切任务,处理好各班组出现的一切问题。
5. 开好班前会,班后会、做好交接班记录。
曹养章
6.生产计划生产调度现场管理流程 篇六
<计调科工作流程图><业务流程>1.盘点昨天生产数据及各工段现有车辆数量<负责人/协助人><所需资料>各车间工段长昨天生产报表、月度批次表等2.简单分析该数据调度3.9点开生产晨会制造本部领导、调度、各车间主任、工段长、生服部等部门负责人各车间的生产情况及遇到的问题4.整理记录晨会内容当日未能解决调度晨会记录表5.跟踪解决晨会问题调度/各车间主任、段长及其他有关人员当日产量、计划、车型等6.协调处理应急事件与该事件有关的部门及人员公司的相关管理规定7.三点半开例会各车间段长当天计划的完成数据及情况8.跟踪解决例会中的问题调度、与问题有关部门人员9.统计当天生产情况调度/各工段长生产报表10.安排班车调度/物流科11.填写调度日志,同夜班人员交接调度/夜班人员调度日志结束
7.进程调度流程图 篇七
电力调度两票制度由电力调度工作票制度和电力调度操作票制度两方面所组成, 其中:
电力调度工作票是需要完成电气设备上的工作时 (如检修、清扫等) 要根据工作情况填写的票单。
电力调度操作票是记录变电现场设备状态切换 (即倒闸操作) 顺序的票单。该票单在实际操作中用于规范操作人员的动作, 防止误操作。[1]
每一种类型均有自己的工作流程, 其中计划工作票——操作票流程较为复杂, 现以这种流程为例作流程分析。
计划工作票——操作票流程:首先由相关部门 (如各区/厂/农电部/计量站/变电工区室/公司等) 负责人向调度部门提出申请, 调度值班人员接到申请后填写计划工作票, 应包括工作的开始及结束时间、工作内容、线路或设备、安全措施等内容并签名, 而后报调度部门负责人审核。若审核通过, 则由调度部门负责人签字批准后, 回退并由调度值班人员负责执行, 同时转计划操作票流程, 待计划操作票流程结束后, 由调度值班人员报完工后流程结束;若审核未通过, 则逐级回退并要求对计划工作票作修改, 并重新执行计划工作票流程。
计划操作票是在收到计划工作票通知后开始工作流程, 首先由施工单位负责人提出申请, 由调度值班人员受理后填写操作票, 主要是记录变电现场设备状态切换 (即倒闸操作) 顺序的操作命令, 签字后报调度部门负责人审核;若审核通过, 则由调度部门负责人签字批准后, 逐级回退调度值班人员及施工单位负责人, 由施工单位负责人打印操作票后交工作人员, 按照操作票上的命令逐项执行, 操作完成后回复调度值班人员, 由调度值班人员报完工后流程结束;若审核未通过, 则逐级回退并要求对计划操作票作修改, 而后重新执行计划操作漂流程。
由此可以看出, 电力调度两票的步骤依据电力公司调度生产制度进行, 办事流程相对固定, 表现为结构化多次重复的流程;同时也有即席的流程 (即临时性的不确定流程) 特点。电力调度两票在审核执行过程中涉及到表单的处理和传递, 各职能部门业务流程紧密集成, 涉及多个部门多种角色的人员协同参与。同时又要和各业务部门的新老系统保留接口、共享数据, 执行环境是异构、复杂的。而且, 完成一个流程通常需要各类人员相互协作, 如果某个环节发生错误, 将会产生业务回退的情况, 因此, 传统的MIS方法, 数据库技术不能很好的应对此类问题。工作流技术, 则以其高效建模、有序协调的特点可以有针对性的解决这类应用问题, 开发出符合实际需要的两票调度系统, 从而大大提高电力系统的安全稳定运行水平。
“工作流技术 (workflow) 主要是利用相关领域的人力及信息技术资源, 协调工作过程中的各个环节, 使之按照一定顺序依次执行, 从而实现业务流程的自动化, 达到提高工作效率的目的。”[2]工作流技术作为现代企业实现过程管理与过程控制的一项关键技术, 为企业的经营过程提供了一个从模型建立与管理到运行与分析的完整框架;同时, 工作流管理系统通过一套集成化、可互操作的的软件工具为这个框架提供了全过程的支持。
国内外不同的研究机构对工作流有不同的释义与描述, 但均认为工作流是经营过程的一个计算机实现, 工作流管理系统 (WFMS, WorkFlow Management System) 则是指运行在一个或多个工作流引擎上, 用于定义、实现和管理工作流运行的一套软件系统。它与工作流执行者 (人、应用) 交互, 推进工作流实例的执行, 并监控工作流的运行状态。工作流管理的主要目标是通过调用有关的信息资源与人力资源来协调业务过程中的各个环节, 使之按照一定的顺序依次进行, 从而实现业务过程的自动化。
工作流管理系统的基本过程包括:业务流程描述→过程定义→分解为活动创建过程实例→表示为活动实例→执行工作单元。
其中, 过程定义 (Process Definition) , 又称为工作流模型, 是业务过程的计算机化的形式表示, 由活动及活动之间的关系 (路径和规则) 所形成的网络构成。同时它还包括指示流程启动和终止的条件、与各个活动相关的信息等。它定义的是过程运行中各个工作环节及相互之间的控制流动与数据流动关系等。目前的工作流管理系统在过程定义阶段均使用可视化的业务过程建模工具, 使得用户在建模过程中比较直观, 并得到相应的业务过程的形式化表示, 所得到的工作流模型具有比较强的描述能力, 易于使用、易于修改并能够适应不断变化的工作环境的要求。
工作流模型是整个工作流管理系统的基础, 它包括一系列描述过程、任务、任务间关系及角色的定义。本系统采用的工作流建模工具WorkFlow为用户提供了一个建立规范的业务流程的接口, 同时它所建立的工作流过程可以作为运行时系统的输入, 投入运转、执行并接受监控。WorkFlow不仅提供建立工作流模型所需的活动、连接弧等各类基本元素, 而且采用图形化操作界面, 只需要利用鼠标的点击与拖动, 就可以非常简单的建立活动、连接弧等各类基本元素之间的关系;同时提供用户定义各模型单元属性的对话框, 支持模型的保存与读取、多层次建模、与外部自动应用的接口等多种功能。
以下是采用建模工具WorkFlow所建立的计划工作票流程建模效果图 (如图1)
从计划工作票流程模型效果图可以看出, “申请”、“受理”、“审核”等图标代表业务流程的每一个步骤, 带有指向性的连接弧则表明业务流程的顺序, 通过下一级属性对话框设置和修改其属性。在效果图中有些图标之间具有双向连接弧, 表明业务流程存在“回退”情况。
下图是计划操作票工作流程实例建模效果图 (如图2)
通过专用工作流建模工具Workflow, 本系统顺利完成了电力调度两票工作流程建模, 建立起部门、角色、人员以及工作流程、活动等实体关系, 并形成规范的模型数据库, 并由系统管理员完成模型的实例化并监控工作流实例的运行。目前本系统已在河北省部分市县电力公司得到应用, 取得了较好的效果, 并在进一步完善之中。
摘要:电力调度两票在电力系统运行中起着至关重要的作用。如何高效开发调度两票系统成为很多高校与科研机构关注的重点。本文介绍工作流管理技术在电力调度两票开发中的应用, 重点介绍了流程模型的实现过程。
关键词:工作流管理技术,电力调度两票,过程定义
参考文献
[1]邓兆云, 张建平.电力调度生产管理信息系统的工作流系统.电力系统自动化, 2003.8, 27卷16期:78~81.
【进程调度流程图】推荐阅读:
进程调度08-28
指挥调度中心工作流程08-02
生产调度工作流程及工作标准10-24
夏的进程散文07-31
中国法治建设进程09-30
tmp进程结束10-24
浅议法治建设进程06-21
农村奔小康进程分析06-27
经济全球化进程08-22
中国现代化进程的发展09-04