
操作系统之——Linux
文章平均质量分 89
敲完代码好睡觉zzz
好好学习,天天向上。
展开
-
Linux平台下变量在栈帧中的存储
局部变量的存储位置是在栈中,栈在内存中的特点是自上而下生长,也就是由高地址到低地址,当变量作为函数参数传递时为传值方式,函数形参作为接收方会开辟一块临时空间来拷贝实参的值,如下代码:650) this.width=650;" src="http://s5.51cto.com/wyfs02/M01/7E/64/wKioL1b-ILyCJeKlAABJJbHIj1E243.png" title="QQ原创 2017-10-20 20:40:17 · 362 阅读 · 0 评论 -
Linux之————守护进程与crond定时任务
一. 守护进程 守护进程又称为精灵(Daemon)进程,顾名思义,守护是一直会存在的,它是运行在后台的一种特殊的进程,独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。比如当Linux系统启动的时候会启动一些系统服务进程,因为这些进程没有控制终端因此不能直接和用户进行交互,它的生命周期随系统,而不是像用户登录或者运行程序才开始启动的而进程运行完毕或者用户注销后就终止,这种进程就原创 2017-10-20 20:41:38 · 2681 阅读 · 0 评论 -
线程安全与可重入函数的区别与联系
一. 线程安全 前面提到过线程的同步与互斥,也就是当两个线程同时访问到同一个临界资源的时候,如果对临界资源的操作不是原子的就会产生冲突,使得结果并不如最终预期的那样,比如如下的程序:#include #include int g_val = 0;void* fun(void *arg){ int i = 0; while(i++ 上面创建了两个线程,我们知道,同一个进程中的线程之原创 2017-10-20 20:41:24 · 546 阅读 · 0 评论 -
Linux之————信号
一. 信号 我们在shell下运行起来一个程序,可以在这个进程正在运行的时候键盘输入一个Ctrl+C,就会看到这个进程被终止掉了,其实当我们键入Ctrl+C的时候是向进程发送了一个SIGINT信号,这时候产生了硬件中断则系统会从执行代码的用户态切入到内核态去处理这个信号,而一般这个信号的默认处理动作是终止进程,因此正在运原创 2017-10-20 20:41:21 · 298 阅读 · 0 评论 -
读写锁————用互斥量和条件变量模拟
一. 读写锁 在多线程环境下为了防止对临界资源访问的冲突我们往往会在线程函数中加入互斥锁来完成线程间的互斥;但是,在有些情况下,互斥锁mutex并不是那么高效,比如当要对一块缓冲区进行读写操作的时候,因为读的需要比写入修改的需要要多,读取数据并不会修改缓冲区的数据个数或者内容,如果要使用互斥锁就会耗费额外的时间,每一次读取都要争夺锁资源挂起等待,因此就可以使用另外一种锁机制————读写锁。原创 2017-10-20 20:40:45 · 793 阅读 · 0 评论 -
信号量————生产者与消费者模型(环形缓冲区)
一. 信号量 在进程间通信中有一种通信机制是信号量,它往往标识着一个临界资源的有无来控制不同的进程是否能访问到这个临界资源,它创建出来一般是一个信号量集的形式。 这里要提到的信号量,也是一个计数器,用来标识资源的个数,我们知道完成线程之间的互斥可以使用互斥锁,其实mutex也可以认为是一个计数器标识资源的可用数量,只是它的值非0即1,加锁时表示要使用资源,将mutex减1,释放锁表示有原创 2017-10-20 20:40:43 · 1473 阅读 · 0 评论 -
线程的同步与互斥(生产者与消费者模型)
一个进程中可以有多个线程,这些线程共享进程的资源,但当多个线程访问同一个资源时,在并不能保证操作是原子的情况下,就会产生冲突而使数据最终的结果不准确,像上次我们提到的将一个数进行加1操作需要三步:将数据从内存中取出;将数据加1;再将数据放回内存中,当多个线程并发执行这一操作时,有可能一个线程刚将数据从内存中取出就被临时切换出去了,这时别的线程进行加1操作,而当被切出去的线程重新回来继续执行加1操作原创 2017-10-20 20:40:40 · 1028 阅读 · 0 评论 -
线程的同步与互斥(死锁的产生和避免)
可以知道,一条语句对一个变量进行+1操作,转成汇编指令共有三条:将这个变量从内存中取出;将其值加1;再将加后的结果放回内存;当一个进程中的两个线程同时进行这个操作时,本来期望的是将变量进行两次加1,但中途有可能当一个线程刚从内存中将变量取出就被切换暂停了,此时线程会保存硬件上下文,第二个线程将变量加1之后前面切出去的线程回来继续执行,这时保存的还是变量原来的值,再将变量加1,会发现变量的最终结果并原创 2017-10-20 20:40:37 · 505 阅读 · 0 评论 -
线程的控制与分离
一. 线程 可以知道,进程是作为系统中资源分配的一个基本实体,而线程就是在进程中作为资源调度的一个基本运行单位。 一个进程当中可以有多个线程,这些线程共享调用它们的进程中的资源,比如进程的uid和gid;比如文件描述符表和当前工作目录;比如每种信号的处理方式等; 但是每个线程也有属于自己私有的一份数据,比如每个线程都有自己的ID号;有自己的上下文,包括各种寄存器的值、程序计数器和原创 2017-10-20 20:40:34 · 248 阅读 · 0 评论 -
进程间通信(IPC)之————共享内存
一. 共享内存 在系统中,两个不同的进程都会维护自己的一块地址空间,这个地址空间一般是虚拟地址,会通过mmu和页表映射到对应的物理内存中,因为不同的进程会有不同的内存空间,因此两个进程之间是无法看见彼此的数据的,而共享内存就是使两个进程看到同一块地址空间,以此来实现不同进程间的数据交互。 值得提出的是,共享内存是进程间通信方式中最高效的一种,因为是直接通过访问内存来交换数据的,省去了消原创 2017-10-20 20:40:31 · 452 阅读 · 0 评论 -
进程间通信(IPC)之————信号量
一. 信号量 在谈论信号量之前,先要提到临界资源和临界区的概念,临界资源是指多个进程访问但一个时间段内只允许一个进程独占的资源,而临界区是指多个进程访问临界资源的这一段公共的代码。 信号量的本质是一种数据操作锁,也可以说就是一个计数器,它本身并不能提供对进程间的通信,而是通过控制某一资源来完成进程间的互斥和同步,比如当一个进程请求某一用信号量来表示的临界资源时,先要进行检查该资源的信号原创 2017-10-20 20:40:28 · 430 阅读 · 0 评论 -
进程间通信(IPC)之————消息队列
一.消息队列 前面提到的进程间通信的一种最基本的方式就是管道,而现在来谈一下另一种进程间的通信方式——消息队列。消息队列是从一个进程向另一个进程发送数据块的方式,每个数据块都有其类型,接收者接收的数据块也可以有不同的类型,这样我们就可以通过发送消息的方式来避免命名管道的同步和阻塞问题。 消息队列不同于管道的是,管道是基于字节流的,而消息队列是基于消息的,而且消息队列的读取方式不一定是原创 2017-10-20 20:40:26 · 269 阅读 · 0 评论 -
进程间通信(IPC)之————管道
在Linux操作系统中,每个进程都有属于自己的运行空间,空间内存放有数据和执行代码,那么不同的进程相互之间是如何进行数据和信息的交换呢?Linux中提供了一种用于进程间通信(IPC-Inter Process Communication)最基本的机制——管道。 在Linux系统中一切皆文件,管道是一种特殊的文件,它是在内核中开辟了一块缓冲区,该缓冲区大小往往是固定的,Ubuntu中为6553原创 2017-10-20 20:40:23 · 304 阅读 · 0 评论 -
inode及硬链接和软链接
*inode* 当我们需要打开一个文件的时候,往往是输入打开文件的命令加上文件名,这时操作系统就会去硬盘上查找对应的文件,这里应该知道,Unix/Linux系统内部并不使用文件名来查找相应的文件,而是通过一个叫“文件索引节点”的inode来进行查找,而这个inode用来存放文件的元信息,比如文件的创建者、文件的size和文件的时间信息等等,而每一个文件也相应的对应一个inode。*inode原创 2017-10-20 20:40:20 · 326 阅读 · 0 评论 -
漫谈shell脚本
一. 关于shell shell,英文是壳,外壳的意思,至于在计算机中,同样有这样的一层意思,也就是可以将shell看做是计算机系统封装的一层外壳,来供用户使用,因此,用户可以通过操纵shell也就是输入一系列命令来达到各种需要的目的,那么shell也可以被称为命令解释器。 在shell下,用户可以键入一行命令而shell解释一行来使其依次执行不同的任务,这种方式称为交互式,如果在执行原创 2017-10-20 20:42:54 · 4713 阅读 · 1 评论