linux进程相关几个关键点

1 死锁:两个或两个以上的进程因竞争系统资源而处于无休止的相互等待状态,致使哪个进程也无法继续执行。
2 Linux进程调度方法:《》
#define SCHED_OTHER  0   //普通进程时间片轮转算法
#define SCHED_FIFO   1   //实时进程先进先出算法
#defien SCHED_RR     2   //实时进程时间片轮转算法
linux用task_struct中的四个数据作为调度的依据:police counter priority rt_priority
police决定是普通进程还是实时进程
priority是普通进程的优先级 0--70数值越大优先级越高
re_priority是实时进程的优先级
counter是每个进程的计数器


Linux进程调度采用了动态优先级和权值的方法,保证实时进程优先级高于普通进程的原因:
调度程序首先给可运行队列中每个进程赋予一定的权值(weight)。普通进程的权值就是它的counter值,而实时进程的权值是它的rt_priroty的值加1000.内核函数goodness()对进程进行加权处理。
Linux进程调度的对象是可运行队列;调度程序shedule()根据进程的权值决定下一个进程的运行。实时进程的权值大于普通的进程 总的来说 SCHED_FIFO > SCHED_RR > SCHED_OTHER


待实时进程全部运行结束 普通进程进行调度:
counter值是下一个进程调度的依据,进程在运行过程中,其counter值不断减小,会出现两种情况,一种情况是进程使用完时间片后让出CPU,这时进程仍然在可运行队列中,但是他的counter已经是0.另一种情况是该进程还没有用完时间片,因为等待某个事件放弃了CPU并且进入了等待队列,等到再次进入可运行状态时,counter的值已经减小。这两种情况都使得counter小于尚未投入运行时,也就是说他们已经不再具有特别大的优先级。再次调度时,那些priority比他们小,但是counter值比他们大进程将被选中。priority 和 counter都表示进程的时间片,priority表示分配给进程的时间片的大小,而counter表示进程剩余时间片的大小。在进程的运行过程中,counter不断地减小而priority的值是不变的 它用于在counter的值变为0是对其进行赋值。只有所有普通进程的counter都为0后,调度程序才会对其进行重新赋值,系统开始新一轮的调度 priority是静态的 counter是动态的


进程什么时候会被调度?
【进程的状态发生变化】
1 运行态下的进程由于等待资源或其他进程退出运行态时;
2 运行态下的进程执行结束;
3 处于等待态的进程被唤醒时
4 进程接收调试时 
5 被调试的进程转到运行态时
【当前进程时间片用完】
need_resched = 1;
【进程从系统调用返回到用户态时】
【中断处理后 系统返回到用户态】
3 Linux进程的创建和撤销
创建fock()  执行exec() 撤销release()


4 Linux进程通信--信号
信号的主要作用是把系统中发生的某些事件通知给线程。Linux信号的数量与运行的机器平台有关,80x86 32位字长对应的信号有32种,64位平台对应的信号有64种 系统中每一种信号都是一个整数 Linux信号值从1开始 0作为特殊信号进行处理 信号的产生主要发生在以下3种情况:
【进程在执行过程中发生了某种错误】
【系统或用户发出了控制进程终止或暂停的信号】
【内核需要控制进程的运行而产生的信号】
#include <stdlib.h>
#include <signal.h>
#include <unsitd.h>
int count = 0;
void ctrl_c_count(int);
main()
{
  int c;
  void (*old_handler)(int);
  old_handler = signal(SIGINT,ctrl_c_count);
  while((c = getchar()) != '\n');
  printf("Ctrl_C count = %d",count);
  signal(SIGINT,old_handler);
}
void ctrl_c_count(int dump)
{
printf("Ctrl_C\n");
count++;
}


改程序中使用了signal()重新设置了键盘输入CTRL-C对应的信号 SIGINT 的处理函数ctrl_c_count()。在程序运行中每当按下CTRL-C,变量count 加1 当按下回车键后 显示count计数值 并恢复CTRL-C的原处理函数。


5 Linux进程通信--管道
信号和管道都是早期UNIX操作系统使用的进程间通信方式 信号在进程间传送的是一个整数值 而管道可以传送大量的数据。
Linux采用的管道机制是一种传送方向固定的单相通道,数据在管道中以字符流的方式传送 以字节为基本单位 Linux把管道看作是一种文件,但是只能使用物理内存 不可以使用外部磁盘存放数据
Linux管道分为两种 有名管道和无名管道 无名管道用于父子进程之间 有名管道可以在任意进程之间通信。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值