操作系统
@make great efforts
这个作者很懒,什么都没留下…
展开
-
task_struct结构体, 理解结构体中的各个字段的含义
本文的重点是剖析task_struct,在这之前我们先来认识下进程的概念和linux进程控制块PCB首先什么是进程?1>进程是程序的一个执行的实例;2>进程是正在执行的程序3>进程是能分配处理器并由处理器执行的实体按内核的观点来谈进程:它所担当分配系统资源(CPU时间,内存)的实体。进程的两个基本的元素如下:一、程序代码(可能被执行相同程序的其它进程共享)二是和代码相关联的数据集...原创 2018-03-18 14:51:31 · 4990 阅读 · 2 评论 -
【进程间通信】------二元信号量P/V操作,封装成动态/静态库,并分别使用并测试
1、信号量相关代码生成静态库comm.h 1 #include <stdio.h> ...原创 2018-04-23 16:11:02 · 291 阅读 · 0 评论 -
【进程间通信】——认识同步与互斥,了解生产者消费者原理。
临界资源在操作系统中,进程是占有资源的最小单位(线程可以访问其所在进程内的所有资源,但线程本身并不占有资源或仅仅占有一点必须资源)。但对于某些资源来说,其在同一时间只能被一个进程所占用。这些一次只能被一个进程所占用的资源就是所谓的临界资源。典型的临界资源比如物理上的打印机,或是存在硬盘或内存中被多个进程所共享的一些变量和数据等(如果这类资源不被看成临界资源加以保护,那么很有可能造成丢数据的问题...原创 2018-04-23 17:11:35 · 3742 阅读 · 1 评论 -
线程控制(二)------线程等待、分离与结合属性
线程等待为什么需要线程的等待?已经退出的线程,其空间没有被释放,仍然在进程的地址空间。创建新的线程不会复用刚才退出线程的地址空间。 调用该函数的线程将挂起状态,直到id为thread的线程终止,thread线程以不同的方法终止,通过pthread_join得到的终止状态是不同的,总结如下: 1、 如果thread线程通过return返回,value_ptr所指向的单元里...原创 2018-05-08 20:23:08 · 145 阅读 · 0 评论 -
【进程间通信】-------消息队列(msgqueue)
认识消息队列消息队列提供了一个从一个进程向另外一个进程发送一块(有类型)数据的方法。每个数据块都被认为是一个类型,接收者进程接收的数据块可以有不同的类型值。消息队列也有管道一样的不足,就是每个消息的最大长度是有上限的(MSGMAX),就是每个消息队列的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也有个上限(MSGMNI)。 IPC对象数据结构/usr/include/li...原创 2018-04-21 22:57:48 · 2010 阅读 · 0 评论 -
进程间关系和守护进程
一、进程组/作业/会话1、进程组1)每个进程除了有一个进程ID之外,还属于一个进程组,进程组是一个或多个进程的集合,通常,它们与同一作业相关联,可以接收来自同一终端的各种信号 2)每个进程有一个唯一的进程组ID。每个进程组可以有一个组长进程,组长进程的标识是,进程组ID等于其进程的ID。 3)组长进程可以创建一个进程组,创建该组中的进程。然后终止,只要在某个进程组中有一个进程存在,...原创 2018-04-27 00:09:23 · 876 阅读 · 0 评论 -
信号的基本概念及产生
一、信号的基本概念 一些小细节: 1、Ctrl-C产生的信号只能发给前台进程。一个命令后面加上一个&可以放到后台运行,这样shell不必等待进程结束就可以接受新的命令,启动新的进程。 2、shell可以运行一个前台程序和任意多个后台进程,只有前台进程才能接到想Ctrl -C这样控制键产生的信号。 3、前台进程在运行过程中用户随时可能按下Ctrl-C而产生一个信号,也就是说该进程的用...原创 2018-04-28 12:37:05 · 1325 阅读 · 0 评论 -
阻塞信号及相关的函数
1、信号的其他的常见的概念实际执行信号的处理动作称为信号抵达(Delivery)信号从产生到抵达之间的状态称为信号未决(Pending)进程可以选择阻塞(Block)某个信号被阻塞的信号产生时保持在未决状态,直到进程解除对此信号的阻塞,才执行抵达的动作注意阻塞和忽略是不同的,只要信号被阻塞就不会抵达,而忽略是在抵达之后可选的一种处理动作。2、内核中的表示 我们可以从中...原创 2018-04-28 14:49:49 · 460 阅读 · 0 评论 -
捕捉信号
之前我们知道,操作系统会在合适的时候对接收到的信号做出相应的处理。 那么现在我们知道这个合适的时候就是:进程从内核态返回到用户态,会检查信号,并作出相应的处理。 下面我们来详细的说下这到底是怎么回事? 1、当我们在执行我们所写的一个程序的时候,可能会因为中断、异常或者系统调用从而进入内核。 2、进入内核,内核会处理这些问题,处理完以后内核会返回到用户态,然而在返回之前,内核做的最后一件事情...原创 2018-04-28 19:46:00 · 439 阅读 · 0 评论 -
线程的基本概念
一、 线程的概念, 总结Linux下线程有什么特点。 1)什么是线程在一个程序里的一个执行路线就叫做线程(thread)更准确的定义就是“线程就是一个进程内部的控制序列”。线程是在进程内部运行的执行流(线程在进程的地址空间)。一切进程至少有一个执行线程Linux没有真正的线程,用进程模拟线程,linux下的进程称为轻量级进程线程是调度的基本单位 2)进程和线程 线程...原创 2018-04-28 23:51:23 · 686 阅读 · 0 评论 -
gdb调试多进程程序
默认设置下我们在调试多进程程序时gdb志愿汇调试主进程,但是gdb(>v7.0)支持多进程的分别以及同时调试,换句话说,gdb可以同时调试多个程序。只需要设置follow-fork-mode(默认值:parent)和detach-on-fork(默认值:on)即可。 follow-fork-mode和detach-on-fork说明: follow-fork-mode de...原创 2018-04-29 19:07:27 · 202 阅读 · 0 评论 -
线程控制(一)------线程的创建与终止
引言: 我们先在学的线程都是用户级库线程(POSIX),我们通过基本的学习认识到了与线程有关的函数构成了一个完整的系列,绝大多数的函数的名字都是以“pthread”打头的,在使用这些函数的时候引入的头文件是一、创建线程pthread_create函数 错误检查:常见的函数,成功返回0,失败返回-1,并且对全局变量errno赋值以指示错误 -pthreads函数出错时不...原创 2018-04-29 20:04:43 · 265 阅读 · 0 评论 -
【线程】--------认识死锁
一、死锁1)提出 多线程与多进程提高了系统资源的利用率,然而并发执行也会带来一些问题,如死锁。 2)概念 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 3)死锁在现实生活中的实例 在一个计算机系统中,只有一个打印机和一个...原创 2018-04-29 23:16:50 · 269 阅读 · 0 评论 -
【进程间通信】-----共享内存
1、概念: 共享内存允许两个不相干的进程访问同一个逻辑内存。 共享内存是最快的IPC形式。省略了两次拷贝,不再涉及到内核,进程不再通过通过执行内核中的系统调用来传递彼此的数据。共享内存的生命周期随内核。 优点: 1)数据的共享使进程间的数据不用相互的传递,而是直接通过访问内存,加快了效率。 缺点 1)共享内存没有同步与互斥机制,我们需要用其他方法进行进程间的同步机制。 我们需要借助互...原创 2018-04-23 11:16:47 · 543 阅读 · 0 评论 -
编写简单的add/sub/mul/div函数,并打包成动/静态库,并分别使用。
动态库和静态库首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用。 什么时候我们会用到库呢?一种情况是某些代码需要给别人使用,但是我们不希望别人看到源码,就需要以库的形式进行封装,只暴露出头文件。另外一种情况是,对于某些不会进行大的改动的代码,我们想减少编译的时间,就可以把它打包成库,因为库是已经编译好的二进制了,编译的时候只需要 Link ...原创 2018-04-12 23:34:13 · 1042 阅读 · 0 评论 -
模拟实现僵尸进程, 孤儿进程
在Linux下进程有多种状态以下就是我列举的一些状态:R运行状态(running):并不意味着进程一定在运行中,它表明进程要么在运行中要么在运行队列里。S睡眠状态(sleeping):意味着进程在等待事件的完成(这里的睡眠有时候也会叫可中断睡眠)(interruptible sleep)。D磁盘休眠状态(Disk sleep):有时候也叫做不可中断睡眠(uninterruptible sleep)...原创 2018-03-18 20:52:33 · 217 阅读 · 0 评论 -
练习使用setenv, export等环境变量相关的函数和命令
setenv函数作用:改变或增加环境变量相关函数getenv,putenv,unsetenv,首先要说明的是,通过此函数并不能添加或修改shell进程的环境变量,或者说通过setenv函数设置的环境变量只在本进程,而且是本次执行中有效。如果在某一次运行程序时执行了setenv函数,进程终止再次运行该程序,上次的设置是无效的,上次设置的环境变量是不能读到的。参数value则为变量内容,参数overw...原创 2018-03-18 22:00:18 · 1777 阅读 · 0 评论 -
实现myshell
在写shell之前我们需要先明白以下内容在进行写shell之前要明白shell的基本原理:,在实现shell的过程中,我们需要循环以下的过程:1、获取命令行2、解析命令行3、建立一个子进程(fork)4、替换子进程(execvp)5、父进程等待子进程的退出(wait)根据这些思路以及我们之前学的技术,就可以来实现自己的shell了。linux系统中的shell最常见的就是BASH,可以使用以下几种...原创 2018-03-22 22:39:18 · 594 阅读 · 0 评论 -
Linux下进程创建, 等待, 终止
在Linux下进程是怎样创建的,关于fork函数又是怎样实现系统调用的,我们可以通过本次实验进行进一步的了解。在Linux下fork函数是非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。#include <stdio.h>pid_t fork(void);返回值:子进程中返回0,父进程返回子进程id,出错返回-1进程调用fork,当进程转移到内核...原创 2018-03-25 00:21:52 · 269 阅读 · 0 评论 -
popen/system, 理解这两个函数和fork的区别.
s在linux下我们应该尽量的避免使用system。现在我们就来看看linux下的system()函数的简单的介绍:#include <stdlib.h>int system(const char* command) system()函数调用/bin/sh来执行参数的指定命令,/bin/sh一般是一个软连接,指向某个具体的shell,比如bash,-c选项是告诉she...原创 2018-03-31 10:46:30 · 2180 阅读 · 0 评论 -
封装fork/wait等操作
刚看到这个题目的时候,换是有点陌生的,因为自己对这个知识点感到有点陌生,通过相关的查资料,我对这个问题有了一定的认识,下面就是我对这个问题的相关的解答。可能自己写的并不是特别的完美。编写函数 process_create(pid_t* pid, void* func, void* arg), func回调函数就是子进程执行的入口函数, arg是传递给func回调函数的参数. 代码的实现如下...原创 2018-03-31 13:43:54 · 216 阅读 · 0 评论 -
centOS 6.5如何设置中文输入法方法
今天我来给大家写下最简单的安装中文的办法,简单好用,几个步骤就能让你的虚拟机变得好用。让我们拭目以待吧!!!! 1.在命令窗口输入su root命令,使之切换到root用户。 2、输入命令 yum install “@Chinese Support” 在安装完毕之后我们会看到系统给你的提示,说你完成,这些和用yum安装软件是一样的,相信我们大家都会安装的。 3、3.等待程序安装成功...原创 2018-04-01 19:54:32 · 3891 阅读 · 2 评论 -
【进程间通信】----管道
进程间通信的概念:进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。 以Linux中的C语言编程为例。 进程通信的本质是两个毫不相干的进程,看到了同一份资源(...原创 2018-04-16 10:56:48 · 154 阅读 · 0 评论 -
open/read/write/close等文件相关系统调用接口
1、系统调用 操作系统会对外表现为一个整体,但是会暴露自己的部分接口,这由操作系统提供的部分接口,称为系统调用。 2、库函数 系统调用进行适度封装,从而形成了库,有利于开发者进行二次开发。 下面我们就来解释系统函数与库函数的关系: 在下面这张图我们可以看到操作系统在底层软硬件的分层结构,同时观察到lib库函数所在与系统调用的关系,显然他们是上下级的关系,lib是对系统调用的二次封装,方便...原创 2018-04-11 01:11:46 · 805 阅读 · 0 评论 -
fd(文件描述符)与FILE结构体
文件描述符fd 通过对open函数的学习我们现在知道了文件描述符就是一个小整数,从0开始。是文件指针数组的下标。 0&1&2 #include <stdio.h> 2 #include <sys/types.h> 3 #include <sys/stat.h> 4 #include <fcntl.h>...原创 2018-04-11 16:14:28 · 1864 阅读 · 0 评论 -
对之前编写的自主shell进行修改,使其支持输入/输出/追加重定向
我们之前已经写过相关的代码的问题了,今天我们就对随后的代码进行修改,相关的概念性的问题,在这里我就不再进行多余的赘述了。 我们知道对于Linux来说,shell就是一个命令行解释器,当我们输入相关的命令,会去执行相关的操作。 比如当我们在输入ls -a -l命令,shell就会打印出当前目录的内容,这是如何实现的呢,shell自己就是一个进程,当我们输入类似于ls的命令,它会通过fork,ex...原创 2018-04-12 18:28:12 · 474 阅读 · 0 评论 -
【进程间通信】------信号量(sems)
一直想看看ftok函数,今天就在这里进行简单的介绍下 ftok()函数我们在进行IPC通讯的时候必须指定一个ID值,这个值通常情况下就是由ftok进行提供。 ftok原型如下: key_t ftok( char * fname, int id ) 参数说明: fname就时您指定的文档名 id是子序号...原创 2018-04-22 15:13:49 · 800 阅读 · 0 评论 -
操作系统--------页面置换算法
我在很多地方遇到了这个问题,所以想写来看看,避免在以后换回再次的遇到这个问题,就在今天进行深入的了解下这个问题,我先它会对我以后的生活工作会有很大的帮助的。概念在地址映射过程中,若在页面中发现所要访问的页面不再内存中,则产生缺页中断。当发生缺页中断时操作系统必须在内存中选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的算法我们就叫页面置换算法。为什么...原创 2018-05-22 01:06:53 · 1548 阅读 · 0 评论