1. 程式人生 > >LTP 第一章 LTP介紹及內部機制

LTP 第一章 LTP介紹及內部機制

LTP系列連結:

1.1 LTP介紹

LTP(Linux Test Project),是基於GPL協議的開源社群合作專案。2000年由SGI發起,IBM、OSDL和Bull等公司共同參與,2001年後由SUSE、富士通、Red Hat、Oracle共同開發和維護。

通過功能測試壓力測試迴歸測試來驗證Linux系統的可靠性、穩定性和健壯性。整個專案約4000個測試用例,絕大部分用例採用C或Shell。

LTP不僅測試核心,還測試整體系統環境,對功能執行失敗時的返回和處理也進行測試。

1.1.1 功能測試

主要對man pages中1、8命令和2系統呼叫所描述的功能進行驗證。

1.1.2 迴歸測試

修改了舊程式碼後,重新進行測試已確認修改沒有引入新的錯誤或導致其他程式碼產生錯誤。

1.1.3 壓力測試

測試系統功能特性再大負荷壓力下的穩定性和可靠性。

1.2 LTP環境部署

1.2.1 下載LTP

獲取最新版可以執行以下命令:git clone https://github.com/linux-test-project/ltp.git

1.2.2 部署LTP

首先執行下面命令安裝相關軟體包(已安裝可跳過):

#CentOS
sudo yum install autoconf  automake  autotools-dev m4

#Ubuntu
sudo apt-get install autoconf automake autotools-dev m4

在上節中我將ltp專案下載到了wxs使用者的家目錄(/home/wxs)下,如圖所示:

[[email protected] ~]$ cd ltp/
[[email protected] ltp]$ ls
aclocal.m4      configure.ac  INSTALL           pan                   testcases
autom4te.cache  confLkNw6U    install-sh        README.kernel
_config testscripts confc20wzw COPYING lib README.md TODO config.guess doc ltpmenu runltp tools config.log execltp m4 runltplite.sh utils config.status execltp.in Makefile runtest ver_linux config.sub IDcheck.sh Makefile.release scenario_groups Version configure include missing scripts VERSION

進入ltp目錄cd ltp

生成自動工具make autotools

系統環境配置./configure

編譯make -j$(getconf_NPROCESSORS_ONLN)

安裝sudo make install

依次執行以上命令後,LTP已經被正確安裝到你的Linux系統中,預設安裝位於/opt/ltp/

[wxs@bogon ltp]$ cd /opt/ltp/
[wxs@bogon ltp]$ ls
bin         runltp         runtest          share      testscripts  Version
IDcheck.sh  runltplite.sh  scenario_groups  testcases  ver_linux

需要注意的是,我們通過git clone命令下載的位於home目錄下的ltp資料夾為ltp原始碼資料夾,我將在後文簡稱為原始碼包

通過執行一系列命令安裝到/opt目錄下的ltp資料夾為ltp安裝資料夾,我將在後文簡稱為安裝包

1.3 目錄結構

1.3.1 原始碼包

LTP原始碼包目錄結構描述如下:

名稱 說明
INSTALL LTP安裝配置指導文件
README LTP介紹
CREDITS 記錄對LTP有很大貢獻的人
COPYING GNU公開許可證
ChangeLog 描述版本變化
ltpmenu 規劃執行LTP的圖形化介面介面
Makefile LTP頂層目錄的Makefile,負責編譯安裝pan、testcases和tools
runalltests.sh 順序執行全部測試用例並且報告結果的指令碼
doc/* 工程文件包含工具和庫函式使用手冊,描述各種測試
include/* 通用的標頭檔案目錄
lib/* 通用的函式目錄
testcases/* 包含在LTP下執行和bin目錄下的所有測試用例和連結
testscripts/* 存放分組的測試指令碼
runtest/* 為自動化測試提供命令列表
pan/* 測試的驅動裝置,具備隨機和並行測試的能力
scratch/* 存放零碎測試
tools/* 存放自動化測試指令碼和輔助工具

LTP測試套件包含以下內容:

[wxs@bogon ~]$ cd ltp/testcases/
[wxs@bogon testcases]$ ls
commands  demoA  kernel  Makefile  network               realtime
cve       kdump  lib     misc      open_posix_testsuite

目錄結構描述如下:

名稱 說明
commands 常用命令測試
kernel 核心模組及其相關模組
kdump 核心現崩潰轉儲測試
network 網路測試
realtime 系統實時性測試
open_posix_testsuite posix標準測試
misc 崩潰、核心轉出、浮點運算等測試

1.3.2 安裝包

LTP安裝包目錄結構描述如下:

名稱 說明
bin 存放LTP測試的一些輔助指令碼
results 測試結果預設儲存目錄
testcases 測試項集
output 測試日誌預設儲存目錄
share 指令碼使用說明目錄
runtest 測試驅動(用於連結testscripts內的測試指令碼和testcases測試專案)
lib 通用的庫函式目錄

1.4 測試框架

1.4.1 整體測試流程

ltp安裝包根目錄下的runltp指令碼是LTP自動測試系統的入口,其提供了一系列引數選項,允許使用者設定測試環境制定測試集、控制測試結果輸出方式和路徑等,執行runltp會生成指定的測試列表並呼叫測試驅動PAN來開始測試,待執行完畢後根據PAN返回的結果來生成報告。

PAN是LTP的一組測試驅動程式,負責實際測試的執行,根據runltp傳遞的引數和測試列表來依次執行測試,輸出執行過程中的詳細資訊,對每個測試用例的執行結果進行統計,並將整體測試結果返回給runltp。

整體測試流程

1.4.2 測試用例執行流程

測試用例執行流程

測試結果的輸出型別如下:

Type Description
BROK 程式執行中途發生錯誤而使測試遭到破壞
CONF 測試環境不滿足而跳過執行
WARN 測試中途發生異常
INFO 輸出通用測試資訊
PASS 測試成功
FAIL 測試失敗

1.4.3 測試庫

LTP目前測試庫存在新舊測試庫交替的情況,本文均採用新測試庫的框架,具體的更新說明可以參考更新文件An update on the Linux Test Project

測試庫

Old Library New Library
測試用例在執行時呼叫測試庫的API 在測試庫維護的子程序中回撥測試用例
setup()中逐一呼叫API完成測試準備 setup()中測試屬性以結構體變數定義
main()定義在每個測試用例當中 main()定義在測試庫中
cleanup()中不能呼叫SAFE函式 cleanup()中允許呼叫SAFE函式

這裡以umount02為例,比較新舊框架的區別:

舊框架程式碼:

//Example using the old LTP library
//https://lwn.net/Articles/708250/

#include <errno.h>
#include <sys/mount.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/fcntl.h>
#include <pwd.h>

#include "test.h"
#include "safe_macros.h"

static void setup(void);
static void cleanup(void);

char *TCID = "umount02";

#define DIR_MODE        S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH
#define FILE_MODE        S_IRWXU | S_IRWXG | S_IRWXO
#define MNTPOINT        "mntpoint"

static char long_path[PATH_MAX + 2];
static int mount_flag;
static int fd;

static const char *device;

static struct test_case_t {
    char *err_desc;
    char *mntpoint;
    int exp_errno;
    char *exp_retval;
} testcases[] = {
    {"Already mounted/busy", MNTPOINT, EBUSY, "EBUSY"},
    {"Invalid address space", NULL, EFAULT, "EFAULT"},
    {"Directory not found", "nonexistent", ENOENT, "ENOENT"},
    {"Invalid  device", "./", EINVAL, "EINVAL"},
    {"Pathname too long", long_path, ENAMETOOLONG, "ENAMETOOLONG"}
};

int TST_TOTAL = ARRAY_SIZE(testcases);

int main(int ac, char **av)
{
    int lc, i;

    tst_parse_opts(ac, av, NULL, NULL);

    setup();

    for (lc = 0; TEST_LOOPING(lc); lc++) {
        tst_count = 0;

        for (i = 0; i < TST_TOTAL; ++i) {
            TEST(umount(testcases[i].mntpoint));

            if ((TEST_RETURN == -1) && (TEST_ERRNO == testcases[i].exp_errno)) {
                tst_resm(TPASS, "umount(2) expected failure; "
                            "Got errno - %s : %s",
                            testcases[i].exp_retval,
                            testcases[i].err_desc);
            } else {
                tst_resm(TFAIL, "umount(2) failed to produce "
                            "expected error; %d, errno:%s got %d",
                            testcases[i].exp_errno,
                            testcases[i].exp_retval, TEST_ERRNO);
            }
        }
    }

    cleanup();
    tst_exit();
}

static void setup(void)
{
    const char *fs_type;

    tst_sig(FORK, DEF_HANDLER, cleanup);

    tst_require_root();

    tst_tmpdir();

    fs_type = tst_dev_fs_type();
    device = tst_acquire_device(cleanup);

    if (!device)
        tst_brkm(TCONF, cleanup, "Failed to obtain block device");

    tst_mkfs(cleanup, device, fs_type, NULL, NULL);

    memset(long_path, 'a', PATH_MAX + 1);

    SAFE_MKDIR(cleanup, MNTPOINT, DIR_MODE);

    if (mount(device, MNTPOINT, fs_type, 0, NULL))
        tst_brkm(TBROK | TERRNO, cleanup, "mount() failed");

    mount_flag = 1;

    fd = SAFE_OPEN(cleanup, MNTPOINT "/file", O_CREAT | O_RDWR);

    TEST_PAUSE;
}

static void cleanup(void)
{
    if (fd > 0 && close(fd))
        tst_resm(TWARN | TERRNO, "Failed to close file");

    if (mount_flag && tst_umount(MNTPOINT))
        tst_resm(TWARN | TERRNO, "umount() failed");

    if (device)
        tst_release_device(device);

    tst_rmdir();
}

新框架程式碼:

//Example using the new LTP library
//https://lwn.net/Articles/708251/

#include <errno.h>
#include <string.h>
#include <sys/mount.h>
#include "tst_test.h"

#define MNTPOINT        "mntpoint"

static char long_path[PATH_MAX + 2];
static int mount_flag;
static int fd;

static struct tcase {
        const char *err_desc;
        const char *mntpoint;
        int exp_errno;
} tcases[] = {
        {"Already mounted/busy", MNTPOINT, EBUSY},
        {"Invalid address", NULL, EFAULT},
        {"Directory not found", "nonexistent", ENOENT},
        {"Invalid  device", "./", EINVAL},
        {"Pathname too long", long_path, ENAMETOOLONG}
};

static void verify_umount(unsigned int n)
{
        struct tcase *tc = &tcases[n];

        TEST(umount(tc->mntpoint));

        if (TEST_RETURN != -1) {
                tst_res(TFAIL, "umount() succeeds unexpectedly");
                return;
        }

        if (tc->exp_errno != TEST_ERRNO) {
                tst_res(TFAIL | TTERRNO, "umount() should fail with %s",
                        tst_strerrno(tc->exp_errno));
                return;
        }

        tst_res(TPASS | TTERRNO, "umount() fails as expected: %s",
                tc->err_desc);
}

static void setup(void)
{
        memset(long_path, 'a', PATH_MAX + 1);

        SAFE_MKFS(tst_device->dev, tst_device->fs_type, NULL, NULL);
        SAFE_MKDIR(MNTPOINT, 0775);
        SAFE_MOUNT(tst_device->dev, MNTPOINT, tst_device->fs_type, 0, NULL);
        mount_flag = 1;

        fd = SAFE_CREAT(MNTPOINT "/file", 0777);
}

static void cleanup(void)
{
        if (fd > 0 && close(fd))
                tst_res(TWARN | TERRNO, "Failed to close file");

        if (mount_flag)
                tst_umount(MNTPOINT);
}

static struct tst_test test = {
        .tid = "umount02",
        .tcnt = ARRAY_SIZE(tcases),
        .needs_root = 1,
        .needs_tmpdir = 1,
        .needs_device = 1,
        .setup = setup,
        .cleanup = cleanup,
        .test = verify_umount,
};

1.5 測試執行

1.5.1 整體測試

我們可以測試所有的測試集,直接執行runltp命令將測試ltp/scenario_groups/default中的所有測試集,一次測試約2~3小時。

[wxs@bogon ltp]$ cd /opt/ltp
[wxs@bogon ltp]$ sudo ./runltp

當然我們可以只測試某個測試集,測試集可以在ltp/runtest/下檢視。

[[email protected] ltp]$ ls runtest/
admin_tools         ipc                    net_stress.ipsec_udp
can                 kernel_misc            net_stress.multicast
cap_bounds          ltp-aiodio.part1       net_stress.route
commands            ltp-aiodio.part2       net.tcp_cmds
connectors          ltp-aiodio.part3       net.tirpc_tests
containers          ltp-aiodio.part4       network_commands
controllers         ltp-aio-stress.part1   nptl
cpuhotplug          ltp-aio-stress.part2   numa
crashme             ltplite                pipes
cve                 lvm.part1              power_management_tests
dio                 lvm.part2              power_management_tests_exclusive
dma_thread_diotest  math                   pty
fcntl-locktests     mm                     quickhit
filecaps            modules                sched
fs                  net.features           scsi_debug.part1
fs_bind             net.ipv6               securebits
fs_ext4             net.ipv6_lib           smack
fs_perms_simple     net.multicast          stress.part1
fs_readonly         net.nfs                stress.part2
fsx                 net.rpc                stress.part3
hugetlb             net.rpc_tests          syscalls
hyperthreading      net.sctp               syscalls-ipc
ima                 net_stress.appl        timers
input               net_stress.broken_ip   tpm_tools
io                  net_stress.interface   tracing
io_cd               net_stress.ipsec_icmp
io_floppy           net_stress.ipsec_tcp
[[email protected] ltp]$ sudo ./runltp -f modules

需要注意的是,如果我們測試某個測試集,runltp需要指定-f引數。

1.5.2 單獨測試

如果我們不想測試某個測試集,只想測試某個單獨的測試,可以採用安裝包測試或者原始碼包測試。下面以access01為例,講解單獨測試。

1.5.2.1 安裝包測試

進入安裝包,執行以下命令即可。

[wxs@bogon ltp]$ cd /opt/ltp/
[wxs@bogon ltp]$ sudo ./runltp -s access01

需要注意的是,如果我們測試某個測試,runltp需要指定-s引數。

1.5.2.2 原始碼包測試

進入原始碼包,找到access01的位置,直接執行./access01即可。

[wxs@bogon access]$ cd ~/ltp/testcases/kernel/syscalls/access/
[wxs@bogon access]$ sudo ./access01

我們看到access01位於testcases目錄下,實際上testcases目錄下每個檔案都是一個完整的可執行程式,可以在編譯後的原始碼路徑直接執行。

1.6 牛刀小試

本節中牽扯到的專案均位於原始碼包testcases下自建的demoA資料夾中。測試方法均採用測試集測試(C實現的測試用例可以採用原始碼測試和測試集測試,Shell實現的測試用例只可以採用測試集測試)。

[wxs@bogon ~]$ cd ~/ltp/testcases/
[wxs@bogon testcases]$ mkdir demoA
[wxs@bogon testcases]$ cd demoA/
[wxs@bogon demoA]$ pwd
/home/wxs/ltp/testcases/demoA

1.6.1 驗證sqrt() 函式

參考1.3.3節中給出的示例程式碼,編寫測試用例sqrt.c

#include <errno.h>
#include <string.h>
#include <sys/mount.h>
#include "tst_test.h"

static struct tcase {
    const int input;
    const int output;
} tcases[] = {
        {-1,1},
        {9,3}
};

static void testSqrt(unsigned int n){
    struct tcase *tc = &tcases[n];

    TEST(sqrt(tc->input));

    if (TEST_RETURN != tc->output) {
        tst_res(TFAIL, "sqrt() failed");
        return;
    }
    tst_res(TPASS, "sqrt() succeeds");
}

static struct tst_test test = {
        .tid = "testSqrt",
        .tcnt = ARRAY_SIZE(tcases),
        .test = testSqrt,
};

參考testcases目錄下的其他Makefile檔案,編寫Makefile:

top_srcdir ?= ../..

include $(top_srcdir)/include/mk/testcases.mk

include $(top_srcdir)/include/mk/generic_leaf_target.mk

sqrt:  LDLIBS += -lm

需要注意的是,這裡的top_srcdir指的是ltp目錄,因為demoA目錄位於ltp目錄的內兩層,所以使用了../..

還需要注意的是,要想成功使用sqrt命令必須附加-lm引數,在Makefile中已經體現這一點。

執行make命令,生成可執行檔案sqrt

[[email protected] demoA]$ make
make -C "/home/wxs/ltp/lib" -f "/home/wxs/ltp/lib/Makefile" all
make[1]: 進入目錄“/home/wxs/ltp/lib”
make[2]: 進入目錄“/home/wxs/ltp/lib/newlib_tests”
make[2]: 對“all”無需做任何事。
make[2]: 離開目錄“/home/wxs/ltp/lib/newlib_tests”
make[2]: 進入目錄“/home/wxs/ltp/lib/tests”
make[2]: 對“all”無需做任何事。
make[2]: 離開目錄“/home/wxs/ltp/lib/tests”
make[1]: 離開目錄“/home/wxs/ltp/lib”
gcc -g -O2 -g -O2 -fno-strict-aliasing -pipe -Wall -W -Wold-style-definition -D_FORTIFY_SOURCE=2 -I../../include -I../../include -I../../include/old/   -L../../lib  sqrt.c   -lltp -lm -o sqrt
sqrt.c: 在函式‘testSqrt’中:
sqrt.c:17:2: 警告:隱式宣告函式‘sqrt’ [-Wimplicit-function-declaration]
  TEST(sqrt(tc->input));
  ^
In file included from sqrt.c:4:0:
sqrt.c:17:7: 警告:隱式宣告與內建函式‘sqrt’不相容 [預設啟用]
  TEST(sqrt(tc->input));
       ^
../../include/tst_test.h:176:17: 附註:in definition of macro ‘TEST’
   TEST_RETURN = SCALL; \
                 ^

這裡可以直接執行命令./sqrt來執行這個測試用例,但是對於下節的shell測試用例就不能這樣做了,本節我都將它寫在自定義測試集中。

首先複製可執行檔案sqrt安裝包testcases/bin/目錄下:

[wxs@bogon demoA]$ sudo cp sqrt /opt/ltp/testcases/bin/

然後進入安裝包runtest目錄下,編寫自定義測試用例集demoA:

[wxs@bogon runtest]$ cat demoA 
sqrt sqrt

測試用例集中每個測試用例包括兩部分:前部分為暱稱,後部分為testcases/bin/目錄下的檔名,中間用空格分隔。

進入上層目錄,執行整體測試命令:

[wxs@bogon runtest]$ cd ..
[wxs@bogon ltp]$ sudo ./runltp -f demoA

執行後程序會輸出一大段,我們只需關心最重要的部分。我定義從<<<test_start>>><<<test_end>>>中間的內容為test體,後文均以此稱呼:

···
<<<test_start>>>
tag=sqrt stime=1506106767
cmdline="sqrt"
contacts=""
analysis=exit
<<<test_output>>>
tst_test.c:915: INFO: Timeout per run is 0h 05m 00s
incrementing stop
sqrt.c:20: FAIL: sqrt() failed
sqrt.c:23: PASS: sqrt() succeeds

Summary:
passed   1
failed   1
skipped  0
warnings 0
<<<execution_status>>>
initiation_status="ok"
duration=0 termination_type=exited termination_id=1 corefile=no
cutime=0 cstime=0
<<<test_end>>>
···

可以看到,兩個測試點一個FAIL,一個PASS。對照sqrt.c檔案中給出的測試資料,發現測試沒有問題。至此,一個簡單的LTP測試用例就完成了。

1.6.2 驗證echo命令

重新回到demoA資料夾中,編寫echo.sh檔案,程式碼可以參考原始碼包中testcases/commands中其他的測試用例:

#測試函式執行次數
TST_CNT=1
#測試用例啟動函式
TST_TESTFUNC=do_test
. tst_test.sh

echo_test()
{
    local std_in=$1
    local echo_cmd=$(echo $std_in > a.out)
    local echo_res=$std_in
    local cat_res=$(cat a.out)

    if [ $echo_res = $cat_res ]
    then
        tst_res TPASS "$echo_cmd sucessed" 
    else
        tst_res TFAIL "$echo_cmd failed"
    fi
}

do_test()
{
    echo_test "hello\tworld"
}

tst_run

為echo.sh新增可執行許可權,並複製到安裝包中的testcases/bin/目錄中。

這裡一定要注意,不可以在當前路徑直接./echo.sh執行測試用例!!

[wxs@bogon demoA]$ pwd
/home/wxs/ltp/testcases/demoA
[wxs@bogon demoA]$ sudo chmod +x echo.sh 
[wxs@bogon demoA]$ sudo cp echo.sh /opt/ltp/testcases/bin/

修改上一節中編寫的demoA測試用例集,將echo.sh測試用例新增進去:

[wxs@bogon demoA]$ cd /opt/ltp/runtest/
[wxs@bogon runtest]$ cat demoA 
sqrt sqrt
echo echo.sh

注意了,此時測試用例集中包含了兩個測試用例,那麼後面執行該測試用例集將會執行這兩個測試用例。

進入上層目錄,執行整體測試命令:

[wxs@bogon runtest]$ cd ..
[wxs@bogon ltp]$ sudo ./runltp -f demoA

結果輸出依然很多,我們依然只看最關鍵的部分:

···
<<<test_output>>>
tst_test.c:915: INFO: Timeout per run is 0h 05m 00s
sqrt.c:20: FAIL: sqrt() failed
sqrt.c:23: PASS: sqrt() succeeds

Summary:
passed   1
failed   1
skipped  0
warnings 0
<<<execution_status>>>
initiation_status="ok"
duration=1 termination_type=exited termination_id=1 corefile=no
cutime=0 cstime=0
<<<test_end>>>
<<<test_start>>>
tag=echo stime=1506107663
cmdline="echo.sh"
contacts=""
analysis=exit
<<<test_output>>>
incrementing stop
 1 TPASS:  sucessed

Summary:
passed   1
failed   0
skipped  0
warnings 0
<<<execution_status>>>
initiation_status="ok"
duration=0 termination_type=exited termination_id=0 corefile=no
cutime=2 cstime=5
<<<test_end>>>
···

本次測試輸出包含兩個test體,第一個test體我們在上一節已經說過了,我們直接看第二個test體。該體中共計有1個測試點,狀態為TPASS。

對照echo.sh中的測試點,發現沒有問題。

至此你已經學會了最基本的建立C和Shell的測試用例以及整體測試的方法,本章內容你已經完成了。

相關推薦

LTP 第一 LTP介紹內部機制

LTP系列連結: 1.1 LTP介紹 LTP(Linux Test Project),是基於GPL協議的開源社群合作專案。2000年由SGI發起,IBM、OSDL和Bull等公司共同參與,2001年後由SUSE、富士

架構師之路--搜索業務和技術介紹容錯機制

朋友 單節點 adb 一致性 公司 一個 memcache 消息通知 包括  今天和搜索部門一起做了一下MQ的遷移,順便交流一下業務和技術。發現現在90後小夥都挺不錯。我是指能力和探究心。我家男孩,不招女婿。   在前面的文章中也提到,我們有媒資庫(樂視視頻音頻本身內容)

第一 Typescript 介紹

-type 對象 參考資料 命名 語法 down 命名空間 doc org Typescript 介紹 一、Typescript 簡介 Typescript 是微軟開發的 Javascript 的超集,Typescript 兼容 Javascript,可以載入 Javas

Spring Boot企業微信點餐系統-第一-課程介紹

win maven 開發環境 ast 介紹 前端 pri 系統 詳細說明 一、項目簡介——技術要點 前端和後端: 後端主要技術: 微信接口技術 微信支付 微信掃碼登錄 微信模板消息推送 開發環境 但實際上我用的環境和這上面還是有點不一樣,我服務器用的是win,到

Python數據分析與挖掘第一篇—基本介紹環境搭建

sim python 模塊 功能 對數 numpy 分析 沒有 兩種 一,數據分析與挖掘簡介   所謂數據分析,是對已有的數據進行分析,提取一些有價值的信息,比如平均數,標準差等。而數據挖掘,是對大量的信息進行分析和挖掘,得到一些未知的,有價值的信息。如今日頭條類的新聞推送

[Elasticsearch in Action讀書筆記]第一 Elasticsearch介紹

為什麼需要搜尋引擎 搜尋的目的是快速尋找需要的內容而不用瀏覽整個站點 搜尋結果應該是有順序的,相關度越高的結果越應該排在前面 需要提供篩選,以優化搜尋結果整體的相關性 搜尋的速度不能太慢 由於傳統的關係型資料庫無法很好地解決這類問題,所以需要引入專門的搜尋引擎。

NDK第一--認識NDK簡單的輸出hello world

交叉編譯 在一個平臺下,編譯出另一個平臺能夠執行的二進位制程式碼 平臺:windows,mac,os,linux 處理器:x86,arm,mips 交叉編譯的原理 原始碼–>編譯–>連線–>可執行程式 模擬其他的平臺特

Python資料分析與挖掘第一篇—基本介紹環境搭建

一,資料分析與挖掘簡介   所謂資料分析,是對已有的資料進行分析,提取一些有價值的資訊,比如平均數,標準差等。而資料探勘,是對大量的資訊進行分析和挖掘,得到一些未知的,有價值的資訊。如今日頭條類的新聞推送就是通過對使用者的資訊進行分析和挖掘,從而達到精準推送使用者感興趣的新聞。資料分析和資料探勘往往是密不可

Nginx 實戰-第一 nginx 介紹與安裝部署

1.常見webserver介紹 Apache 和Tomcat Apache和Nginx Tomcat和jetty jboss、tomcat、jetty 總結 2.nginx官網和版本介紹 3.nginx功能介紹 4.nginx安裝和部署 4.1 Nginx安裝 –

淺談Bootstrap學習第一介紹

<!-- 作者:SimpleWu 時間:2018-09-17 描述:Bootstrap之初體驗 --> <!DOCTYPE html> <html> <head> <meta charse

譯_jBPM4使用者指南:第一_介紹

本文為JBoss jBPM4官方使用者指南譯文,可以與原文對照看,水平有限,有不對的地方請不吝指出。原文地址: http://docs.jboss.com/jbpm/v4/userguide/html_single/#d0e14   第一章 介紹 這篇文章最好在火狐瀏覽器中

C++ Primer 第一 學習筆記習題答案

知識點 函式定義 · 一個程式包含一個或多個函式(有且只有一個main函式);一個函式定義包含四部分:返回型別、函式名、形參列表、函式體。如下程式碼為一個最簡單的main函式,int為其返回型別,main為函式名,括號()括起來的為形參列表(可為空),花括號{

第一 Eviews10下載安裝和資料錄入

致謝: 在此感謝廣東外語外貿大學的老師們提供的寶貴的學習資源及資料! 1. Eviews10軟體的安裝 ① 軟體的安裝 需要注意到一些點: 1) 建議在安裝過程中關閉自動更新。 2)

3、第一概論習題答案

1、一條狗攜帶3盒8毫米的磁帶以18km/h的速度奔跑,每盒磁帶容量是7GB。試問在什麼距離範圍內狗的資料傳輸率會超過一條速率為150Mbps的傳輸線?在以下情況下:(1)狗的速度加倍(2)每盒磁帶容量增加(3)傳輸線路的速錄加倍,上述結果的變化。 解:150Mbps傳輸線傳輸7*3=21G

第一 瞭解Web網路基礎

Web 使用一種名為 HTTP(HyperText Transfer Protocol,超文字傳輸協 議  1 )的協議作為規範,完成從客戶端到伺服器端等一系列運作流 程。而協議是指規則的約定。可以說,Web 是建立在 HTTP 協議上通 信的。 Tcp/Ip協議族 通

架構師之路--搜尋業務和技術介紹容錯機制高階教程

java架構師、叢集、高可用、高可擴充套件、高效能、高併發、效能優化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分散式專案實戰 視訊課程內容包含: 高階Java架構師包含:Spring boot、Spring  

jenkins權威指南學習---第一---jenkins介紹

一、背景介紹 jenkins對開發人員和非開發人員都十分有用。有Huston發展而來,由java編寫。最開始是有sun公司一職工憑藉自己的愛好寫的,後來sum公司給oracle收購後,原先團隊的人更希望有一個開源的環境,於是更名huston為jenkins。現在每週都有少部

Jenkins系列之——第一 Jenkins下載安裝

前言:由於我是一個Java開發工作人員,所以教程中的東西都是以Java開發當中的專案為準,至於其他語言的部署暫時不涉獵,等以後有時間了再去研究。 Jenkins下載及安裝 一.下載 Jenkins分安裝版本和通用的war包版本,本系列以都是以war包進行。 1.下載最新版本

第一 tomcat安裝配置詳解

Tomcat Tomcat一般分為兩種:一種為安裝版(在部署在客戶端時使用),一種為解壓版(在開發時使用)。 為什麼開發時選用解壓版Tomcat: 在開發過程中,我們會經常修改配置檔案時,可能會遇到很奇怪的錯誤,為了方便將Tomcat初始化,我們需要重新解壓Tomcat,若我們使用安裝版

QT程序間通訊詳細介紹QProcess機制分析

1、QT通訊機制 為了更好的實現QT的資訊互動,在QT系統中建立了較為完善的通訊機制。QT的通訊可分為QT內部通訊和外部通訊兩大類。對於這兩類通訊機制及應用場合做如以下分析: (1)QT內部物件間通訊 在圖形使用者介面程式設計中,經常需要將一個視窗部件的變化通知給