常见知识

2018-04-09  本文已影响0人  郄郄郄

#define print(x) printf(”the no, ”#x”,is ”)

这里主要是两个语法。

一是在define语句里,  #x 的意思是,替换为一个以x为内容的字符串。 比如  如果你调用 print(10)  那么#x 就等于是写  "10" 这样的。

第二个语法是, 在C语言里, 连续写两个字符串(不需要任何操作符链接)就等于把它们连接起来。

比如 "the no." "is" 就跟写 "the no.is" 是一回事。 (这个语法大概很多人不知道。。其实是很基本的语法,只不过一般用不上所以不起眼)

有这两点这个很容易理解  比如  print(10)在这里会被展开成: printf("the no." "10" ",is")  也就等价于:  printf("the no.10,is")

int *p1=(int *)0x500;

int *p2=(int *)0x518;

p2-p1=?

指针减法运算规则:地址数值之差除以指针类型的长度。

p2 - p1 的差值为0x18,换成十进制就是24,再除以int的长度4,结果就是6.

int a=8;

int ret=printf("%d\n", a);

ret=?

int arr=[1,2,3,4];

int *p=arr;

printf("%d,%d\n", *p,*(++p));

int *arr[5];

int (*arr)[5];

两者区别?

void testFunc() {

    int i;

    char *str=(char *)malloc(5);

    for(i=0;i<4;i++){

        str[i]=i;

    }

    free(str);

    strcpy(str, "test");

    printf("%s\n", str);

}

打印出什么

linux创建线程的函数pthread_create,有四个参数,依次是:1.指向线程标识符的指针 2. 线程的属性 3.线程运行函数的起始地址 4. 线程运行函数的参数(传递的也是指针)

编译时需要加 -lpthread, pthread_join用来等待一个线程的结束

线程的信号量是一种特殊的变量,它可以被增加或减少,但对其的关键访问被保证是原子操作。如果一个程序中有多个线程试图改变一个信号量的值,系统将保证所有的操作都将依次进行。

信号量一般常用于保护一段代码,使其每次只被一个执行线程运行。信号量是用来调协线程对共享资源的访问的。

这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。

互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。

同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,

特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源

linux daemon(守护进程)是运行在后台的一种特殊进程,它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。

它不需要用户输入就能运行而且提供某种服务。Linux系统的大多数服务器就是通过守护进程实现的,常见的守护进程包括系统日志进程

,web服务器httpd,数据库服务器mysqld等

守护进程一般在系统启动时开始运行,除非强行终止,否则直到系统关机都保持运行。一个守护进程的父进程是init进程,因为它真正的父进程在fork

出子进程后就先于子进程exit退出了,所以它是一个有init继承的孤儿进程。守护进程的名称通常以d结尾,比如sshd,xinetd等

创建守护进程的步骤:

编写守护进程的一般步骤:

(1)在父进程中执行fork并exit退出

(2)在父进程中调用setsid函数创建新的会话

(3)在子进程中调用chdir函数,让根目录"/"成为子进程的工作目录

(4)在子进程中调用umask函数,设置进程的umask为0

(5)在子进程中关闭任何不需要的文件描述符

堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏最好平均时间复杂度为O(nlogn),它是不稳定排序。

操作系统进程调度方法:1.先来先服务 2.短作业优先 3.最短剩余时间 4.时间片轮转 5.最高响应比优先 6.公平共享调度

避免死锁算法1:

有序资源分配法

这种算法资源按某种规则系统中的所有资源统一编号(例如打印机为1、磁带机为2、磁盘为3等等),申请时必须以上升的次序。系统要求申请进程:

1、对它所必须使用的而且属于同一类的所有资源,必须一次申请完;

2、在申请不同类资源时,必须按各类设备的编号依次申请。

例如:

进程PA,使用资源的顺序是R1,R2;

进程PB,使用资源的顺序是R2,R1;

若采用动态分配有可能形成环路条件,造成死锁。

采用有序资源分配法:R1的编号为1,R2的编号为2;

PA:申请次序应是:R1,R2

PB:申请次序应是:R1,R2

这样就破坏了环路条件,避免了死锁的发生。

避免死锁算法2:

银行算法

避免死锁算法中最有代表性的算法是DijkstraE.W于1968年提出的银行家算法:

该算法需要检查申请者对资源的最大需求量,如果系统现存的各类资源可以满足申请者的请求,就满足申请者的请求。

这样申请者就可很快完成其计算,然后释放它占用的资源,从而保证了系统中的所有进程都能完成,所以可避免死锁的发生。

内碎片和外碎片,linux内存管理

上一篇 下一篇

猜你喜欢

热点阅读